本人是一个漫画迷,也是一个爬虫新手,由于很不喜欢动漫之家的阅览体验,进而有了这一次的动漫之家漫画下载的小项目,也是由于懒惰的原因选择了selenium来爬取动态页面。

首先:

选择想要爬取的漫画,这里我随便选择了一个漫画来做实验。

获取这个漫画的URL地址:https://www.dmzj.com/info/jinglingzhidan.html

在这个章节页面中使用开发者工具,查看网页的源代码获取章节的URL所在的xpath路径备用

//div[contains(@class,"tab-content zj_list_con ")]/ul[contains(@class,"list_con_li")]/li/a/@href

进入漫画页面,获取所有图片地址的xpath路径,以及图片的数量为拼接地址备用

//div[@class="btmBtnBox"]/select[@id="page_select"]/option

直接访问图片地址发现报403错误

使用开发者工具检查请求头发现无法直接访问图片,服务器需要验证来源页

referer: https://www.dmzj.com/view/jinglingzhidan/60957.html

开始敲代码:

下面是我们需要用到的库

from selenium import webdriver
from selenium.webdriver.common.by import By
import requests
from lxml import etree
import os
import time
from random import uniform

构思一下大概的工作流程

def main():url = "https://www.dmzj.com/info/jinglingzhidan.html"html = getMainPage(url)page = getChapters(html)image = getImage(page)saveImage(image)if __name__ == "__main__":main()

获取章节页面(这里因为不是动态页面,所以直接用requests读取)

def getMainPage(url):'''获取章节页面'''headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',}'''异常管理'''try:response = requests.get(url, headers = headers)if response.status_code == 200:return response.textexcept:print(response.status_code)

使用lxml中的etree进行网页的解析,然后使用xpath获取所有的章节地址

def getChapters(html):'''获取章节URL地址'''html = etree.HTML(html)chapters = html.xpath('//div[contains(@class,"tab-content zj_list_con ")]/ul[contains(@class,"list_con_li")]/li/a/@href')return chapters

拿到所有的的章节地址之后,因为是动态页面,所以偷懒使用了selenium进行网页的抓取。然后使用xpath定位章节中所有的图片地址,章节名,书名等信息,使用生成器返回所需要的数据。最后,关闭浏览器。

def getImage(pages):'''获得章节图片页数'''browser = webdriver.Chrome()for page in pages:# print(str(page))browser.get(str(page))page_num = browser.find_elements_by_xpath('//div[@class="btmBtnBox"]/select[@id="page_select"]/option')# wait = WebDriverWait(browser,10)# wait.until(EC.presence_of_element_located((By.XPATH,'//div[@class="btmBtnBox"]/select[@id="page_select"]')))print(len(page_num)) #获取页面数用来计数'''使用for循环遍历所有的图片'''for num in range(1, len(page_num)+1):'''拼接图片URL地址,获取书名,章节名'''image_page = str(page)+ "#@page={num}".format(num=num)browser.get(image_page)image_url = browser.find_element_by_xpath('//div[contains(@class,"comic_wraCon")]/img')book_title = browser.find_element_by_xpath('//div[@class="head_title"]/h1/a')chapter_title = browser.find_element_by_xpath('//div[@class="head_title"]/h2')page_image = image_url.get_attribute('src')book_name = book_title.textchapter_name = chapter_title.textprint("+" *60)'''因为是犯懒所以没有使用代理池,为了不被封IP地址,所以使用了随机的0到3秒的休眠'''t = uniform(0,3)print(t)time.sleep(t)# print(page_image)# print(book_name)# print(chapter_name)yield page_image, book_name, chapter_name, num, page# breakbrowser.close()

这里因为不是动态页面,所以继续使用requests节省资源,把获取到的数据使用os库写入到本地文件夹

def saveImage(image):for im, name, title, page, referer_page in image:'''注意referer,动漫之家的图片是不能直接访问图片的,需要验证来源页'''headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36','referer': referer_page,}image_response = requests.get(im, headers=headers)'''把获取到的文件写入文件夹'''if not os.path.exists('/Users/admin/Desktop/HOMEWORK/python3教程/spider/images/{name}'.format(name=name)):os.mkdir('/Users/admin/Desktop/HOMEWORK/python3教程/spider/images/{name}'.format(name=name))if not os.path.exists('/Users/admin/Desktop/HOMEWORK/python3教程/spider/images/{name}/{title}'.format(name=name, title=title)):os.mkdir('/Users/admin/Desktop/HOMEWORK/python3教程/spider/images/{name}/{title}'.format(name=name, title=title))if image_response.status_code == 200:file_path = '/Users/admin/Desktop/HOMEWORK/python3教程/spider/images/{name}/{title}/{page}.{jpg}'.format(name=name, title=title, page=page, jpg='jpg')if not os.path.exists(file_path):with open(file_path,"wb") as f:f.write(image_response.content)else:print(image_response.status_code)

最后把文件储存为dmzj_selenium.py文件,然后在终端中直接运行

python3 dmzj_selenium.py

爬下来的文件

selenium 定位li_动漫之家selenium懒爬虫相关推荐

  1. python selenium定位元素方法_[原创] python selenium 元素定位方法封装

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 写好了公用的调用类,接下来就按照pageobject的设计模式写一下基本的元素定位方法,此处我们需要对python的方法传参有所了解,没有自信的同学可以返 ...

  2. python元素定位input button_python+selenium 定位到元素,无法点击的解决方法

    报错 selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (234.75 ...

  3. Selenium定位元素操作实例详解

    Selenium定位元素操作示例 本文实例讲述了Selenium定位元素操作.分享给大家供大家参考,具体如下: Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器 ...

  4. selenium定位方法(java实例)

    从下图中可以看到selenium有三类定位元素的方法,一种是直接通过属性.标签以及链接来定位,一种是XPath方式,最后一种是CSS方式. 下表列举了元素定位的例子 selenium之页面元素定位方法 ...

  5. python元素定位id和name_Python Selenium定位html元素|find_element_by_class-name-id-tag-css-xpath-text...

    Selenium官方给了八种定位方法 1.find_element_by_class_name通过class name定位元素 我们拿Pythonfree网站来举例,点击右上角的搜索框. 鼠标右击搜索 ...

  6. python selenium定位元素方法,python + selenium 练习篇 - 定位元素的方法

    1.利用ID定位元素(能直接通过ID来定位的元素比较少) # coding=utf-8 from selenium import webdriver driver = webdriver.Chrome ...

  7. python网络爬虫系列(七)——selenium的介绍 selenium定位获取标签对象并提取数据 selenium的其它使用方法

    一.selenium的介绍 知识点: 了解 selenium的工作原理 了解 selenium以及chromedriver的安装 掌握 标签对象click点击以及send_keys输入 1. sele ...

  8. 使用Selenium定位鼠标悬浮出现的下拉菜单

    使用Selenium定位鼠标悬浮出现的下拉菜单 1.介绍 一些网站为了能够提供更多入口给用户,在制作网站的时候往往会使用鼠标悬浮出现下拉菜单的功能.以CSDN首页为例,鼠标悬停在个人头像上,会出现与个 ...

  9. Python selenium定位动态下拉框

    Python selenium定位动态下拉框 1.下拉框元素需要点击控件才展示 这里可以使用XPAN定位到下拉框,使用driver.find_element(By.XPATH,"路径&quo ...

最新文章

  1. 数据结构Java版之红黑树(八)
  2. 线程的同步-----Lock同步锁
  3. 2020-10-14 B树 概念添加删除笔记
  4. java 等待几秒_Java并发编程synchronized相关面试题总结
  5. JS魔法堂:doctype我们应该了解的基础知识
  6. 干货:TensorFlow1.2~2.1各个GPU版本CUDA和cuDNN对应版本整理
  7. 安装Magento的系统需求
  8. opencv中Mat与IplImage,CVMat类型之间转换
  9. $NOIp$前的日常
  10. 《并行计算的编程模型》一2.3.2 段信息
  11. UEBA能够检测的七大类安全风险
  12. 关于树节点巨多时获取用户选中(可多选)节点的优化
  13. 防火墙配置文件iptables详解
  14. Spotlight监控Oracle--Spotlight On Oracle安装和使用
  15. unity--newtonsoft.json解析
  16. Hadoop运维记录系列(十九)
  17. 网卡offload功能介绍
  18. STM32F103驱动四位共阳极数码管程序
  19. 计算机网络_选择题(一)
  20. CDN真的有用吗?效果好不好

热门文章

  1. 小学算术自动出题c语言,【小学算术随机出题器】小学算术随机出题器电脑版下载 v0.7 吾爱版-趣致软件园...
  2. 7-12 珍珠项链 (10 分)
  3. C语言位操作 - bit 、byte的清零,置1,提取,判断
  4. ppt模板 免费下载
  5. nginx反向代理(请求转发-URL匹配规则)
  6. 阿里java架构师+职级_阿里 P8 高级架构师年入100W+,到底什么水平?
  7. 2013中国高校SAS数据分析大赛完美落幕
  8. You may need to add 'xxxx.cn' to ALLOWED_HOSTS.
  9. python量化分析—对海龟交易法则的验证
  10. sql sever 函数大全