Python《使用selenium解决动态加载的问题》
爬取的网址呢,还是上一篇博文涉足的 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解决动态加载的问题》相关推荐
- Github配置(git+vscode+python+jupyter)
①下载git 打开 git bash 工具的用户名和密码存储 $ git config --global user.name "Your Name" $ git config -- ...
- 【实验楼】python简明教程
①终端输入python进入 欣赏完自己的杰作后,按 Ctrl + D 输入一个 EOF 字符来退出解释器,你也可以键入 exit() 来退出解释器. ②vim键盘快捷功能分布 ③这里需要注意如果程序中 ...
- 【Kaggle Learn】Python 5-8
五. Booleans and Conditionals Using booleans for branching logic x = True print(x) print(type(x))''' ...
- 【Kaggle Learn】Python 1-4
[Kaggle Learn]Python https://www.kaggle.com/learn/python 一. Hello, Python A quick introduction to Py ...
- 使用python愉快地做高数线代题目~
今天接触到了python,发现真是极易上手啊!对比c语言是什么鬼东西= = 诶,等下,看完教学文章发现TA在下面写了这句话 如果做了前面的内容你可能已被吸引了,觉得c语言真的是废材! 不...不是的. ...
- python 位运算与等号_Python 运算符
和大多数语言一样,Python也有很多运算符,并且运算符跟其他语言的运算符大同小异接下来一一介绍: 算术运算符: 运算符描述实例 +加 - 两个对象相加a+b的输出结果是30 -减 - 得到复数或者一 ...
- python减小内存占用_如何将Python内存占用缩小20倍?
当程序执行过程中RAM中有大量对象处于活动状态时,可能会出现内存问题,特别是在对可用内存总量有限制的情况下. 下面概述了一些减小对象大小的方法,这些方法可以显著减少纯Python程序所需的RAM数量. ...
- python中排序英文单词怎么写_Python实现对文件进行单词划分并去重排序操作示例...
本文实例讲述了Python实现对文件进行单词划分并去重排序操作.,具体如下: 文件名:test1.txt 文件内容: But soft what light through yonder window ...
- python程序如何执行死刑图片_如何判断对象已死
已死的对象就是不可能被任何途径使用的对象,有以下几种方法判断一个对象是否已经死了: 引用计数 给对象添加一个引用计数器,每当有一个地方引用他,计算器就加 1:当引用失效时,计数器减 1:任何时刻计数器 ...
- Python gRPC 安装
1. 安装依赖库 sudo pip3 install grpcio sudo pip3 install protobuf sudo pip3 install grpcio_tools 2. 生成对应文 ...
最新文章
- google的gn构建系统
- 滁州布局创新链服务链~农业大健康·万祥军:谋定功能性农业
- hihoCoder1233(2015北京网络赛H题)
- 解决GitHub未配置SSH key提示错误信息
- 20140617 数组和链表的区别
- Git合并最近的commit
- CentOS7下安装配置Tomcat环境
- kafka传递文件_是否可以使用Kafka传输文件?
- FTP、TFTP、NFS、SSH介绍及在 Ubuntu 上的安装配置
- VBlog 的代码结构, 使用 element, vant 组件开发的纯前端博客
- 足球足球裁判昏招大全裁判昏招大全
- 学生综合素质评价系统c语言,学生综合素质评价表自我评价范文(2)
- [Mac] OSX 快捷键组合 (完整版)
- 基于WiFi的Android局域网即时通讯软件
- CANopen协议学习
- pd.diff()函数详解
- 抽象类和抽象方法详解
- 2013年4月TIOBE编程语言排行榜:Objective-C排名首次下滑
- STM32一个定时器同时捕获4路PWM波
- 贝壳找房 9月7日 笔试题 第四题-查族谱
热门文章
- Outlook 2013 电子邮件账户设置备份与恢复
- MVC的初步认识理论
- TypeScript入门教程 之 模板字符串
- Serverless 实战 —— 轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
- 使用PostgREST的RestAPI操作PostgreSQL数据库教程
- Docker的今生前世,关于Docker的一些见解
- 容器编排技术 -- Kubernetes kubectl create rolebinding 命令详解
- Docker Compose运行MySQL、Redis服务
- 解ns方程_流体动力学NS方程的哲学缺陷
- 思科命令 service password-encryption