码前冷静分析

首先需要准备好selenium、requests库以及Chromedriver

  • 这个就不细说了,有很多博客可以参考

然后讲一下大体思路

首先搜索想要爬取图片的关键词
- 接着是“搜集”搜索结果
- 然后想办法逐一进入搜索结果,进而获取内容
- 最后就是下载了

框架大体如下

框架是个大体思路(草稿),写代码的时候可以灵活来

def get_list(url): #目的是根据关键词搜索,抓取每一条结果的图片链接lst = []browser = webdriver.Chrome()wait = ww(browser, 10)#……等等等等return lst#胡乱摸索了线程简单的应用,就copy了另一个一样的下载函数
def download_pic1(lst): #逐一遍历列表中的图片链接,下载美图return ''def download_pic2(lst): #逐一遍历列表中的图片链接,下载美图return ''def main(): global keywordkeyword = '鬼刀'basic_url = 'https://www.toutiao.com/'lst = get_list(basic_url) #访问主页,搜索,收集结果的图片链接,返回列表download_pic(lst) #根据链接下载图片#就是这么小白式的简单粗暴,水平还不够,暂时就只弄两个函数吧#虽然是有点臃肿了,嘤嘤嘤
  • 先声明下,本人是个小白,可能思路,代码存在一些个问题
  • 这里还请大家多多指教
  • 完整代码在文末

开 码

首先把要用的库给喊粗来

库,函数的使用介绍有很多超棒的博客,本文会给出部分链接
  • 好的,上代码
import requests
from time import sleep
import os
import os.path as op
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait as ww
import threading

1.1 访问今日头条首页,关键词传送及点击搜索

def get_list(basic_url):lst = []browser = webdriver.Chrome()wait = ww(browser, 10)try:browser.get(basic_url)#找到搜索框节点input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#rightModule > div.search-wrapper > div > div > div > input')))#找到搜索按钮节点click = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#rightModule > div.search-wrapper > div > div > div > div > button')))input.send_keys(keyword) #模拟传入搜索词sleep(2)  #输入后停一下,要不然立马让你验证,来自小白的喵喵喵click.click()  #模拟点击搜索按钮except Exception as er:print(er)

# 两个节点的查找看下图

节点查找~超详细解答如下博文

博主 Eastmount 原创
【[python爬虫] Selenium常见元素定位方法和操作的学习介绍】

wait用法详解~如下链接

博主 不码不成才 原创
【python+selenium中的wait事件】

CSS选择器用法介绍~博文链接如下

博主 MXuDong 原创
CSS选择器——cssSelector定位方式详解

到主页后右键—>检查—>开找
- 首先是输入框查找(按照图示顺序很快就找到啦)
- 然后右键点击节点,copy—>copy selector

啦啦啦~

|

节点查找~超详细解答如下博文

博主 Eastmount 原创
【[python爬虫] Selenium常见元素定位方法和操作的学习介绍】

wait用法详解~如下链接

博主 不码不成才 原创
【python+selenium中的wait事件】

CSS选择器用法介绍~博文链接如下

博主 MXuDong 原创
CSS选择器——cssSelector定位方式详解

这样就进入到了搜索结果界面,接下来就是让它加载出更多结果,通过模拟滑动来实现

1.2 接下来便是模拟滑动页面,出加载更多结果,上码

# 首先把browser切换到当前搜索结果的页面
browser.switch_to.window(browser.window_handles[1])
#滑动多少自己可以任意发挥
for i in range(0, 2001, 250):#下边这个方法来模拟滚动屏幕(详解可以参考其它博客)browser.execute_script(f'window.scrollBy(0, {i})')sleep(2)
#滑的差不多了,您是不是该寻思着收集进入结果的''门''了?
clicks = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.link.title')))

模拟滑动所用的方法【execute_script()】相关博客链接如下。

【博主 吾爱乐享 原创-----python学习之滚动页面函数execute_script】
+
【博主 qq_16069927 原创 ----selenium 如何控制滚动条逐步滚动】

  • 来一起找这’'门’‘吧!

    经过观察以及实践,点击标题链接可以进子入页面,就是你了皮卡丘!(就是蓝色阴影那个节点)
  • 首先观察,class有两个属性,所以CSS选择器因该是 ‘.link.title’,既然找到了,就都收集起来吧,哈哈

1.3 接下来,就开始邪恶的循环,打开子页面->回到搜索结果页->打开子页面->回到搜索结果页……

  • 别问为什么,问就是网速慢,先打开页面,让成熟的它自己加载着,然后挨个收割美图链接
  • 不要问为什么不找到链接当时就给图片给下了,问就是缺少仪式感。

上码!

for clc in clicks[1:10]:  # 搜索结果打开数自己定,我是因为穷,惨,所以就10个吧(嘤嘤嘤)clc.click()#进入子页面后,趁它不注意,赶快回到结果页browser.switch_to.window(browser.window_handles[1])
sleep(4)

1.4 然后开始收割美图链接吧,哈哈!

上码!

for num in range(len(browser.window_handles) - 2):#逐个进入子页面browser.switch_to.window(browser.window_handles[num + 2])#等待所有图片节点加载粗来,收集它try: #可能会遇到视频界面,到时候这里判断错误就不管,进入下一个img = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'img[src]')))except:pass#提取链接到列表for mg in img:url = mg.get_attribute('src')if url.startswith('http://p') and 'thumb' not in url:lst.append(url)

老问题,找节点,上图!!!

通过分析,可以看出,文章中图片链接都在图中红线标注的 ‘路径’内,所以……
可以构造一个CSS选择器,筛选出所有含图链接节点 ,通过实战,发现有两种页面:
常见的一种是一页到底那种,图片在-> ‘.article-content div .pgc-img img[src]’,
另一种是跟ins一样左右切换那种
两种页面图片节点路径就不一样了,但是标签名都是<img>属性都是’src’,所以选择器就粗糙一点"img[src]"
这样就需要筛选一下了,粗糙的选择器就会获取到一些广告图,实战发现,广告图链接几乎都是’https://……”而图片链接是“http://……”这就很妙了,如代码

【这里很粗糙,还是可能会爬到不相关的,flag:以后有时间再改进改进】

2.接下来就是下载了!

这里我后来翻了一些优秀博客,胡乱摸索,写了个very简单(因为菜)的双线程下载
说白了就是同时运行两个下载函数,男人嘛,不能叫快要叫效率

上码

def download_pic1():#单独搞个文件夹存一下path = r'C:\Users\PXO\Desktop\杂\Toutiao_pic\\' + keywordif not op.exists(path):os.mkdir(path)ln = len(lst)id = [i for i in range(ln)]cnt = 1for url in lst[:ln//2]:#负责前半部分列表下载#开始搞事情,遍历图片链接,get get get!r = requests.get(url)#这里设置文件保存路径(含文件名)pic_path = path + '\\' + f'{keyword}_pic_{id.pop(0)}.jpg'#以二进制写入方式打开命名好的文件with open(pic_path, 'wb+') as ff:#写入获取到的图片(二进制)//养成好习惯,随手关闭ff.write(r.content)ff.close()#下边是一个小优化,刷新显示当前下载状态op1 = cnt*120//lnen = 60 - op1opp, enn = '-'*op1, '*'*enprint(f'\r[1]下载ing:已下{cnt}/{ln//2}张,[{opp}>{enn}] {(2 * cnt) / len(lst):.1%}', end='')cnt += 1
#下边copy一下就是另一个啦
def download_pic2():path = r'C:\Users\PXO\Desktop\杂\Toutiao_pic\\' + keywordif not op.exists(path):os.mkdir(path)ln = len(lst)id = [i for i in range(ln)]id.reverse()cnt = 1for url in lst[ln//2:]:#负责下载后半部分r = requests.get(url)pic_path = path + '\\' + f'{keyword}_pic_{id.pop(0)}.jpg'with open(pic_path, 'wb+') as ff:ff.write(r.content)ff.close()op1 = cnt*120//lnen = 60 - op1opp, enn = '-'*op1, '*'*enprint(f'\r[2]下载ing:已下{cnt}/{ln//2}张,[{opp}>{enn}] {(2 * cnt) / len(lst):.1%}', end='')cnt += 1
小说明:这里就不传参数了,直接把列表定义为全局变量

线程的代码,还有博客参考如下

 #大家可以参考下面给出的优秀博客threads = []th1 = threading.Thread(target=download_pic1)threads.append(th1)th2 = threading.Thread(target=download_pic2)threads.append(th2)for th in threads:th.setDaemon(True)th.start()th.join()
参考博客链接
[博主 n_laomomo 原创]----Python多线程threading用法
较详细介绍
【博主 DrStream 原创】----python:threading.Thread类的使用详解

奉上完整代码

  • 注意:爬取的时候会出现超时,然后就over了,除了使用try来’试错‘,还可以适当用一下time库的sleep()
import requests
from time import sleep
import os
import os.path as op
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait as ww
import threadingdef get_list(basic_url):'''#这里是无界面浏览器相关操作,不想要弹出界面的话,#把下边那行换成这些就okbrowser_options = webdriver.ChromeOptions()browser_options.add_argument('--headless')browser = webdriver.Chrome(options=browser_options)'''browser = webdriver.Chrome()  #这行就是那行(手动滑稽)wait = ww(browser, 20)try:browser.get(basic_url)print('访问成功!!')sleep(1)input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#rightModule > div.search-wrapper > div > div > div > input')))click = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#rightModule > div.search-wrapper > div > div > div > div > button')))input.send_keys(keyword)sleep(2)click.click()sleep(1)print('搜索成功!')browser.switch_to.window(browser.window_handles[1])for i in range(0, 2001, 250):browser.execute_script(f'window.scrollBy(0, {i})')print(f'\r加载中。。。{i/2000:.1%}', end='')sleep(3)print('')clicks = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.link.title')))cnt = 0want = 10  ## 爬取页面数 for clc in clicks[: want]:  clc.click()sleep(2)cnt += 1browser.switch_to.window(browser.window_handles[1])print(f'\r已打开{cnt}个界面,比例{cnt/want:.2%}', end='')print()for num in range(want):browser.switch_to.window(browser.window_handles[num + 2])try:img = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'img[src]'))) #.article-content div .pgc-img img[src]except:passfor mg in img:url = mg.get_attribute('src')if url.startswith('http://p'):lst.append(url)except Exception as t:print(t)
def download_pic1():path = r'C:\Users\PXO\Desktop\杂\Toutiao_pic\\' + keywordif not op.exists(path):os.mkdir(path)ln = len(lst)id = [i for i in range(ln)]cnt = 1for url in lst[:ln//2]:r = requests.get(url)pic_path = path + '\\' + f'{keyword}_pic_{id.pop(0)}.jpg'with open(pic_path, 'wb+') as ff:ff.write(r.content)ff.close()op1 = cnt*120//lnen = 60 - op1opp, enn = '-'*op1, '*'*enprint(f'\r[1]下载ing:已下{cnt}/{ln//2}张,[{opp}>{enn}] {(2 * cnt) / len(lst):.1%}', end='')cnt += 1
def download_pic2():path = r'C:\Users\PXO\Desktop\杂\Toutiao_pic\\' + keywordif not op.exists(path):os.mkdir(path)ln = len(lst)id = [i for i in range(ln)]id.reverse()cnt = 1for url in lst[ln//2:]:r = requests.get(url)pic_path=path+'\\'+f'{keyword}_pic_{id.pop(0)}.jpg'with open(pic_path, 'wb+') as ff:ff.write(r.content)ff.close()op1 = cnt*120//lnen = 60 - op1opp, enn = '-'*op1, '*'*enprint(f'\r[2]下载ing:已下{cnt}/{ln//2}张,[{opp}>{enn}] {(2 * cnt) / len(lst):.1%}', end='')cnt += 1
def main():global keyword, lstlst = []keyword = '鬼刀' basic_url = 'https://www.toutiao.com/'get_list(basic_url)threads = []th1=threading.Thread(target=download_pic1)threads.append(th1)th2=threading.Thread(target=download_pic2)threads.append(th2)for th in threads:th.setDaemon(True)th.start()th.join()main()

Python Selenium+Requests爬虫[双线程]--今日头条图片爬取【亲测能行!!!】相关推荐

  1. python爬取今日头条专栏_[python3]今日头条图片爬取

    前言 代码设计流程,先模拟ajax发送搜索"街拍美女",提取返回json里面的article_url,再访问article_url,提取article_url响应的图片url,访问 ...

  2. 简单爬虫Ajax数据爬取——今日头条图片爬取

    一.Ajax简介 什么是Ajax? Ajax 即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML),是指一种创建交互式网页 ...

  3. 今日头条图片爬取(一)

    万年老掉牙的头条街拍爬取,不过用来练习还是可以的,也有很多资料查询 1.获取总页面的代码 在头条的右上角搜索选项内搜索街拍,我们看见街拍首页了,然后看看是不是js加载的发现还真是,头条全部都是js加载 ...

  4. 今日头条图片爬取和下载

    import re import requests import json import os from urllib import request def list_pare(url):header ...

  5. Python顶点小说爬虫(《三寸人间》爬取)

    Python顶点小说爬虫(<三寸人间>爬取) 获取整个页面 import requests from bs4 import BeautifulSoup url = "https: ...

  6. python网易云爬虫——实现网易云歌词的爬取(输入歌手的id,即可实现歌词的爬取)

    Python网易云爬虫--实现网易云歌词的爬取(输入歌手的id,即可实现歌词的爬取) 开始动手 打开网易云音乐,找到任意一位歌手的歌曲界面(我们以邓紫棋的<来自天堂的魔鬼>为例). 第一步 ...

  7. python爬虫爬取今日头条_爬取今日头条头条号文章数据

    0,背景介绍 最近想爬取一些今日头条的文章浏览数据,分析哪些头条号做的好,那些做的不好. 今日头条 比如上图的阅读数,评论数以及文章标题,通过这些数据进行分析. 于是展开了艰难的爬虫探索之旅 第一目标 ...

  8. python爬取今日头条_爬取今日头条街拍图片

    参考于崔庆才的Python爬虫教程,但是崔的视频时间过长,今日头条网站反爬虫也有了变化,因此写下此文章来记录自己的爬取过程遇到的问题,也给大家一些借鉴.欢迎大家讨论. 一.获取索引页. 我们会发现do ...

  9. 爬虫 1 ---获取今日头条图片

    主要参考崔庆才(狗粮散播达人)的教程完成对浸提头条图片的爬取 [Python3网络爬虫开发实战] 6.4-分析Ajax爬取今日头条街拍美图 因为网站变动,不能完全照搬他的方法,但是思想上基本一致, 是 ...

最新文章

  1. cmake使用教程(十一)-使用cpack打包源码并编写自动化脚本上传到仓库
  2. GdiPlus[6]: 五种画刷总览
  3. java获取下一季末_java取当前周期、月初至月末、季度初至季度末日期。
  4. [转]springmvc常用注解标签详解
  5. spring boot: GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获
  6. windows dos 常用命令
  7. bzoj 4551[Tjoi2016Heoi2016]树
  8. sqlserver修改链接服务器,sqlserver怎么新建链接服务器
  9. 特斯拉首个中国工厂落户上海临港
  10. HALCON 21.11:深度学习笔记---术语表(7)
  11. Azure 宕机 3 个小时:因人为配置 DNS 失误
  12. 自动生成_橙瓜码字小说自动生成器,对话描写,景物描写,外貌描写自动生成...
  13. Blockchain -Corda框架研究一 sendfile-Attachments学习笔记
  14. java integer最大值_Integer的最大值
  15. 《增长黑客》学习总结
  16. OpenHarmony代码操作总结
  17. python 异常学习1
  18. 微信后台基于时间序的新一代海量数据存储架构的设计实践
  19. FIPS 140-3与140-2的差异-5
  20. 环形缓冲区RingBuff的代码实现

热门文章

  1. 自制Win7安装U盘
  2. 既可以输入新的信息,又可以从下拉框中选择的代码
  3. 会计基础-资本与资本公积核算
  4. 基于容器环境的1-1课堂的开发部署
  5. matlab hanning窗口怎么使用,在Python和Matlab中,Hanning窗口值不匹配
  6. 生物课高中神经调节视频,初中生物神经系统视频
  7. 京东方android面试经验,京东方面试经验
  8. Lenovo A60 终极简单刷机解说 (菜鸟入门)
  9. Download模块 (十二)
  10. 委托与事件_从有趣的例子出发去解析