今天我们来爬取另外个网站https://tu.fengniao.com/ 没错就是这个地址,不用翻其他的标签栏,,这个网站最大的特点就是一直往下翻都会有一个加载的操作,不断加载新的图片上去。可以试着滑动鼠标不断往下翻,不断往下翻,不断往下翻。。。。

与上一篇博文不同的是,我们不是拿到第一张图片点进去,然后while循环去找下一张图片,今天我们换了个大标签,仔细发现网站的url也不一样了,而且我们今天是使用selenium来模拟实现鼠标的往下滑动,这样全部的图片group就能拿到了,这样我们就可以使用正常的方式解析出所有的图片。

第一部分我们先试一试模拟鼠标上下滑动的

import timefrom selenium import webdriver
from selenium.webdriver.chrome.options import  OptionschromeExeLoc = 'D:/software/chrome/chromedriver_win32/chromedriver.exe'# 无头浏览器 这样浏览器就不会弹出那个chrome的web浏览器界面
options = Options()
options.add_argument('--headless')browser = webdriver.Chrome(chromeExeLoc, options=options)
browser.maximize_window()
browser.implicitly_wait(5)browser.get('https://tu.fengniao.com/')
js="window.scrollTo(0,document.body.scrollHeight)"while 1:browser.execute_script(js)a_s = browser.find_elements_by_class_name('picA')print('Total Ims group is: ' + len(a_s))time.sleep(5)

效果如下:

发现,效果是可以的,成功模拟了鼠标往下滑动,且获得了越来越多的图片组。

思路是,一个线程去不断地模拟滑动,然后有了新的数据了,就去给一个线程去操作下载。
为了演示方便,我们保守点,别太贪心,每个子标签下只抓取200个图片组。

那么进入一个照片组后我们如何爬取呢?
假如我们进入到 http://bbs.fengniao.com/forum/pic/slide_101_11158474_100945009.html
发现这个该组图的所有图片都是在一个页面存在的,也就是点击下一页的时候不用刷新页面,所以我们需要从本html中获得所有的img信息。

于是我就把“下载原图”的所在的img的url拿了出来。

做个搜索,果然一下就搜到了所有图片的url信息。
所有的图片信息都是存在于下面这个js的这个picList变量里面的

而且地址都是很完整的,只不过存在一些重复罢了。因此我们通过这个变量的字符串即可得到所有的这个组图的图片。
测试代码如下:

import time
import os
import requests
from bs4 import BeautifulSoupdef find_all(sub, s):index_list = []index = s.find(sub)while index != -1:index_list.append(index)index = s.find(sub, index + 1)if len(index_list) > 0:return index_listelse:return -1def tagSpider(url):html = BeautifulSoup(requests.get(url).text, features="html.parser")html = str(html)a = html[html.find("var picList = eval") : html.find("var picListNum = picList.length")]idx1 = find_all('https', a)idx2 = find_all('jpg', a)print(idx1)print(idx2)bb = set()for i in range(len(idx1)):img_url = a[idx1[i] : idx2[i]+3]img_url = img_url.replace('\\', '')bb.add(img_url)print(bb)url = 'http://bbs.fengniao.com/forum/pic/slide_101_11151649_100820943.html'
tagSpider(url)

效果如下:

嗯呢,不错,组图的数量也是没错的。

上面写了俩demo,接下来我们需要把这几个demo拼接在一起了。

那么完整代码如下:

import time
from concurrent.futures import ThreadPoolExecutor
import time
import os
import re
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import  Optionsrootrurl = 'https://tu.fengniao.com'
save_dir = 'D:/estimages/'
chromeExeLoc = 'D:/software/chrome/chromedriver_win32/chromedriver.exe'headers = {"Referer": rootrurl,'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",'Accept-Language': 'en-US,en;q=0.8','Cache-Control': 'max-age=0','Connection': 'keep-alive'
}  ###设置请求的头部,伪装成浏览器def saveOneImg(dir, img_url):new_headers = {"Referer": img_url,'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",'Accept-Language': 'en-US,en;q=0.8','Cache-Control': 'max-age=0','Connection': 'keep-alive'}  ###设置请求的头部,伪装成浏览器,实时换成新的 header 是为了防止403 http code问题,防止反盗链,try:img = requests.get(img_url, headers=new_headers)  # 请求图片的实际URLif (str(img).find('200') > 1):with open('{}/{}.jpg'.format(dir, img_url.split('/')[-1]), 'wb') as jpg:  # 请求图片并写进去到本地文件jpg.write(img.content)print(img_url)jpg.close()return Trueelse:return Falseexcept Exception as e:print('exception occurs: ' + img_url)print(e)return Falsedef find_all(sub, s):index_list = []index = s.find(sub)while index != -1:index_list.append(index)index = s.find(sub, index + 1)if len(index_list) > 0:return index_listelse:return -1def downPics(dir, url):# 得到所与图片的链接html = BeautifulSoup(requests.get(url).text, features="html.parser")html = str(html)a = html[html.find("var picList = eval") : html.find("var picListNum = picList.length")]idx1 = find_all('https', a)idx2 = find_all('jpg', a)# 图片去重与,url整理组装bb = set()for i in range(len(idx1)):img_url = a[idx1[i] : idx2[i]+3]img_url = img_url.replace('\\', '')bb.add(img_url)# 逐个下载啊for img in bb:saveOneImg(dir, img)def getSubTitleName(str):cop = re.compile("[^\u4e00-\u9fa5^a-z^A-Z^0-9]")  # 匹配不是中文、大小写、数字的其他字符string1 = cop.sub('', str)  # 将string1中匹配到的字符替换成空字符return string1def tagSpider(tag, url):# 无头浏览器 这样浏览器就不会弹出那个chrome的web浏览器界面options = Options()options.add_argument('--headless')browser = webdriver.Chrome(chromeExeLoc, options=options)browser.maximize_window()browser.implicitly_wait(5)browser.get(url)js = "window.scrollTo(0,document.body.scrollHeight)"  # 定义鼠标滑倒底部的动作pics = Nonewhile 1:browser.execute_script(js)    # 每次往下滑到底部,直到有了200个组图就推出了pics = browser.find_elements_by_class_name('picA')print('current length is %d:', len(pics))if len(pics) >= 200:breaktime.sleep(5)# 开始爬取图片for li in pics:# 创建目录subDir = getSubTitleName(li.find_element_by_class_name('pic').get_attribute('title'))new_dir = '{}{}/{}'.format(save_dir, tag, subDir)if not os.path.exists(new_dir):os.makedirs(new_dir)# 下载组图downPics(new_dir, li.get_attribute('href'))  # 爬取每个图片组def getAllTags():list = {}html = BeautifulSoup(requests.get(rootrurl).text, features="html.parser")a_s = html.find('div', {'class' : 'labelMenu module90'}).find_all('a')for a in a_s:list[a.get_text()] = rootrurl + a.get('href')return listif __name__ == '__main__':# 获得所有标签taglist = getAllTags()print(taglist)## 给每个标签配备一个线程# with ThreadPoolExecutor(max_workers=15) as t:  # 创建一个最大容纳数量为20的线程池#     for tag, url in taglist.items():#         t.submit(tagSpider, tag, url)# 单个连接测试下下tagSpider('美女', 'https://tu.fengniao.com/13/')# 等待所有线程都完成。while 1:print('-------------------')time.sleep(1)

所有效果如下:

Python《搞事情==蜂-鸟-图-片(二)》相关推荐

  1. Github配置(git+vscode+python+jupyter)

    ①下载git 打开 git bash 工具的用户名和密码存储 $ git config --global user.name "Your Name" $ git config -- ...

  2. 【实验楼】python简明教程

    ①终端输入python进入 欣赏完自己的杰作后,按 Ctrl + D 输入一个 EOF 字符来退出解释器,你也可以键入 exit() 来退出解释器. ②vim键盘快捷功能分布 ③这里需要注意如果程序中 ...

  3. 【Kaggle Learn】Python 5-8

    五. Booleans and Conditionals Using booleans for branching logic x = True print(x) print(type(x))''' ...

  4. 【Kaggle Learn】Python 1-4

    [Kaggle Learn]Python https://www.kaggle.com/learn/python 一. Hello, Python A quick introduction to Py ...

  5. 使用python愉快地做高数线代题目~

    今天接触到了python,发现真是极易上手啊!对比c语言是什么鬼东西= = 诶,等下,看完教学文章发现TA在下面写了这句话 如果做了前面的内容你可能已被吸引了,觉得c语言真的是废材! 不...不是的. ...

  6. python 位运算与等号_Python 运算符

    和大多数语言一样,Python也有很多运算符,并且运算符跟其他语言的运算符大同小异接下来一一介绍: 算术运算符: 运算符描述实例 +加 - 两个对象相加a+b的输出结果是30 -减 - 得到复数或者一 ...

  7. python减小内存占用_如何将Python内存占用缩小20倍?

    当程序执行过程中RAM中有大量对象处于活动状态时,可能会出现内存问题,特别是在对可用内存总量有限制的情况下. 下面概述了一些减小对象大小的方法,这些方法可以显著减少纯Python程序所需的RAM数量. ...

  8. python中排序英文单词怎么写_Python实现对文件进行单词划分并去重排序操作示例...

    本文实例讲述了Python实现对文件进行单词划分并去重排序操作.,具体如下: 文件名:test1.txt 文件内容: But soft what light through yonder window ...

  9. python程序如何执行死刑图片_如何判断对象已死

    已死的对象就是不可能被任何途径使用的对象,有以下几种方法判断一个对象是否已经死了: 引用计数 给对象添加一个引用计数器,每当有一个地方引用他,计算器就加 1:当引用失效时,计数器减 1:任何时刻计数器 ...

  10. Python gRPC 安装

    1. 安装依赖库 sudo pip3 install grpcio sudo pip3 install protobuf sudo pip3 install grpcio_tools 2. 生成对应文 ...

最新文章

  1. Codeforces 494D Upgrading Array
  2. C# 将数据写入PDF文档
  3. Java ArrayList的不同排序方法
  4. 疫情撬动游戏产业“底层认知”,正向价值愈发突显
  5. iOS开发出错whose view is not in the window hierarchy!的解决
  6. tomcat访问manager报404;server.xml中配置了Context path
  7. Fortran95学习总结
  8. C#实现简单小说阅读器
  9. python的help()用法
  10. Heka的一些计算过程数据存放目录
  11. 05-----关于C++使用VS时出现 error C2248: “xxx“ 无法访问private成员(在“MySpdlog“类中声明)
  12. js几行代码搞定html转图片制作海报,html2canvas应用实例
  13. 一些牛人榜样,多看看他们写的东西
  14. Gerrit安装及使用Nginx反向代理
  15. 湖南大学计算机学硕推免率,19武汉理工计算机考研经历 - 武汉理工大学 - 王道论坛,专注于计算机考研的点点滴滴! - Powered by Discuz!...
  16. 微信小程序关于键盘行为的探索
  17. 在Android项目中使用SpringBoot框架
  18. 化学计量学(1)—基础理论与数据预处理
  19. 2.2数据结构与序列
  20. HTML <header> 标签

热门文章

  1. iOS开发 适配iOS10以及Xcode8-b
  2. 【Android】HorizontalScrollView内子控件横向拖拽
  3. 去掉chrome、safari input或textarea在得到焦点时出现黄色边框的方法
  4. Mac或者Linux安装RabbitMQ
  5. 设计模式:观察者模式 ——— 城管来了,摊主快跑
  6. 【JAVA 第五章 】课后习题 删除奇数元素下标 然后再删除值为奇数的下标
  7. 无公网ip远程访问调试-内网穿透工具
  8. 【Virtual DOM】虚拟 DOM 和 Snabbdom 库
  9. 【C语言】无参函数调用实例
  10. C语言实例-大小写字母间的转换