爬取的网址呢,还是上一篇博文涉足的 https://www.dmzj.com/ 但是这一次,我们使用selenium来获得每个章节的所有图片,因为动态网页比如常见的js动态生成,用静态方法访问网站并且获取html时,js动态生成的这一部分还没有生成,所以静态方法获取不了这一部分信息。

selenium的webdriver,我个人理解webdriver是模拟用户用浏览器访问网络,只不过不是用户亲自用鼠标是双击,而是用的代码。在这里本人使用的是Firefox浏览器。

这部分代码如下:

# 无头浏览器 这样浏览器就不会弹出那个chrome的web浏览器界面
options = Options()
options.add_argument('--headless')browser = webdriver.Chrome(chromeExeLoc, options=options)
browser.maximize_window()
browser.implicitly_wait(5)

对于每个页面都去获得那个有所有img的元素。

做个测试

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.chrome.options import  Optionsdef getAllIms(opts):imglist, taglist = [], []for opt in opts:imglist.append(opt.get_attribute('value'))taglist.append(opt.text[opt.text.find('第') + 1: opt.text.find('页')])return imglist, taglistdef test6():# 无头浏览器 这样浏览器就不会弹出那个chrome的web浏览器界面options = Options()options.add_argument('--headless')browser = webdriver.Chrome(chromeExeLoc, options=options)browser.maximize_window()browser.implicitly_wait(5)browser.get('https://www.dmzj.com/view/chuanlingwuyu/43878.html#@page=1')time.sleep(1)opts = browser.find_elements_by_xpath("//div[@class='btmBtnBox']/select/option")imglist, taglist = getAllIms(opts)print(imglist)print(taglist)if __name__ == "__main__":test6()

输出结果如下:
D:\software\Anaconda3\install\envs\pytorch\python.exe D:/software/PyCharm/code/spider9.py
[‘https://images.dmzj.com/img/chapterpic/1247/25304/14492330112801.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/1449233011435.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/14492330119295.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/14492330124847.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/14492330130246.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/14492330140432.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/14492330152702.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/14494576363317.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/14492330159679.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/14492330165486.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/14492330174622.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/14492330180602.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/14492330190377.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/14492330192663.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/14492330204047.jpg’, ‘https://images.dmzj.com/img/chapterpic/1247/25304/14492330205342.jpg’]
[‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘10’, ‘11’, ‘12’, ‘13’, ‘14’, ‘15’, ‘16’]

Process finished with exit code 0
效果是可以的,现在我们修改之前的代码,当然了,只是修改部分的代码了,大框架可以不用动,只是修改了下载单个章节的逻辑罢了。

完整代码如下:

# coding: utf-8
from concurrent.futures import ThreadPoolExecutor
import time
import os
import requests
from bs4 import BeautifulSoup
from selenium import webdriverfrom selenium.webdriver.chrome.options import  Optionsrootrurl = 'https://www.dmzj.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, idx):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, idx), '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)def getAllIms(opts):imglist, taglist = [], []for opt in opts:imglist.append(opt.get_attribute('value'))taglist.append(opt.text[opt.text.find('第') + 1: opt.text.find('页')])return imglist, taglistdef saveOneCap(dir, href, browser):print(href)browser.get(href)time.sleep(1)opts = browser.find_elements_by_xpath("//div[@class='btmBtnBox']/select/option")imglist, taglist = getAllIms(opts)for i in range(len(imglist)):saveOneImg(dir, imglist[i], taglist[i])def saveOnePageFunc(dir, capters, browser):for cap in capters:# 按照tag和图片组的内容来创建目录new_dir = '{}{}/{}'.format(save_dir, dir, cap.get_text())if not os.path.exists(new_dir):os.makedirs(new_dir)saveOneCap(new_dir, cap.get('href'), browser)time.sleep(2)pass# 单个spider thread
def tagSpider(tag, url):# 无头浏览器 这样浏览器就不会弹出那个chrome的web浏览器界面options = Options()options.add_argument('--headless')browser = webdriver.Chrome(chromeExeLoc, options=options)browser.maximize_window()browser.implicitly_wait(5)# 解析当前页面html = BeautifulSoup(requests.get(url, headers=headers).text, features="html.parser")# 提交一个保存页面的任务saveOnePageFunc(tag, html.find('ul', {'class': 'list_con_li autoHeight'}).find_all('a'), browser)# the job is over.print("thread work over. ")browser.close()browser.quit()if __name__ == '__main__':# 获得所有标签taglist = {'川灵物语': 'https://www.dmzj.com/info/chuanlingwuyu.html','魔王与勇者与圣剑神殿': 'https://www.dmzj.com/info/mwyyzysjsd.html','真励之徒弟': 'https://www.dmzj.com/info/zhenlizhitu.html','妖神记': 'https://www.dmzj.com/info/yaoshenji.html'}# 给每个标签配备一个线程with ThreadPoolExecutor(max_workers=10) as t:  # 创建一个最大容纳数量为20的线程池for tag, url in taglist.items():t.submit(tagSpider, tag, url)# 单个连接测试下下# tagSpider('川灵物语', 'https://www.dmzj.com/info/chuanlingwuyu.html')# 等待所有线程都完成。while 1:print('-------------------')time.sleep(1)

效果如下:



Python《使用selenium解决动态加载的问题》相关推荐

  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. google的gn构建系统
  2. 滁州布局创新链服务链~农业大健康·万祥军:谋定功能性农业
  3. hihoCoder1233(2015北京网络赛H题)
  4. 解决GitHub未配置SSH key提示错误信息
  5. 20140617 数组和链表的区别
  6. Git合并最近的commit
  7. CentOS7下安装配置Tomcat环境
  8. kafka传递文件_是否可以使用Kafka传输文件?
  9. FTP、TFTP、NFS、SSH介绍及在 Ubuntu 上的安装配置
  10. VBlog 的代码结构, 使用 element, vant 组件开发的纯前端博客
  11. 足球足球裁判昏招大全裁判昏招大全
  12. 学生综合素质评价系统c语言,学生综合素质评价表自我评价范文(2)
  13. [Mac] OSX 快捷键组合 (完整版)
  14. 基于WiFi的Android局域网即时通讯软件
  15. CANopen协议学习
  16. pd.diff()函数详解
  17. 抽象类和抽象方法详解
  18. 2013年4月TIOBE编程语言排行榜:Objective-C排名首次下滑
  19. STM32一个定时器同时捕获4路PWM波
  20. 贝壳找房 9月7日 笔试题 第四题-查族谱

热门文章

  1. Outlook 2013 电子邮件账户设置备份与恢复
  2. MVC的初步认识理论
  3. TypeScript入门教程 之 模板字符串
  4. Serverless 实战 —— 轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
  5. 使用PostgREST的RestAPI操作PostgreSQL数据库教程
  6. Docker的今生前世,关于Docker的一些见解
  7. 容器编排技术 -- Kubernetes kubectl create rolebinding 命令详解
  8. Docker Compose运行MySQL、Redis服务
  9. 解ns方程_流体动力学NS方程的哲学缺陷
  10. 思科命令 service password-encryption