**

python 爬虫+selenium 全自动化下载JS动态加载漫画

最近刚学的python,代码可能并不规范,希望大家见谅!

爬取之前,我们首先需要做一些准备工作,因为很多网站都有反爬检索,为了应对这种情况,通用的办法是添加headers和proxies,但是单一的headers依然有很大风险,所以我们需要随机获取这些:

1获取国内代理网站的代理:

from fake_useragent import UserAgent
import random
import requests
import re
from lxml import etree
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import os
import time
import urllib.parsedef get_ip():# 国内免费代理网站,可以换成其他,但是不同网站格式不同,需要自己修改regip表达式url = 'https://www.kuaidaili.com/free/inha/'# 获取多少页可以自己设置,但是不建议太多url_list = [url + str(i + 1) for i in range(2)]print(url_list)ip_list = []for i in range(len(url_list)):url = url_list[i]html = requests.get(url=url, ).textregip = '<td.*?>(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})</td>.*?<td.*?>(\d{1,5})</td>'matcher = re.compile(regip, re.S)ipstr = re.findall(matcher, html)# 设置等待时间减少被禁的概率time.sleep(1)for j in ipstr:ip_list.append(j[0] + ':' + j[1])print('共收集到%d个代理ip' % len(ip_list))print(ip_list)return ip_list

2验证代理的可用性(并不是所有IP都是有效的)

def valVer(proxys):badNum = 0goodNum = 0good = []for proxy in proxys:try:proxy_host = proxyprotocol = 'https' if 'https' in proxy_host else 'http'proxies = {protocol: proxy_host}print('现在正在测试的IP:', proxies)# 测试的网站可以自由填写,最好是你目标网站,响应时间根据自己需要调整response = requests.get('https://www.manhuabei.com', proxies=proxies, timeout=4)if response.status_code != 200:badNum += 1print(proxy_host, 'bad proxy')else:goodNum += 1good.append(proxies)print(proxy_host, 'success proxy')except Exception as e:print(e)badNum += 1continueprint('success proxy num : ', goodNum)print(good)return good

3 建立随机headers

代理已经搞定,接下来就是headers了,不过所幸的是python有一个随机库 fake_useragent,不需要我们自己去处理然后配合上面代理,一个随机代理+headers的组合就出现了

from fake_useragent import UserAgent
import requests
import random
headers = {"User-Agent": UserAgent().random}
print(headers)
t_list = get_ip()
proxies_list = valVer(t_list)
print(proxies_list)
# 随机
proxies = {'http': random.choice(proxies_list)}
headers = {"User-Agent": UserAgent().random}
url = "https://www.manhuabei.com/manhua/nvzixueyuandenansheng/"
# 随机代理+headers+url 请求
response = requests.get(url,proxies=proxies,headers=headers)

4(主体)漫画抓取

主体部分
需要先下好对应浏览器的驱动

def downloadimg(commicurl,main_url):t_list = get_ip()proxies_list = valVer(t_list)print(proxies_list)# 随机proxies = {'http': random.choice(proxies_list)}headers = {"User-Agent": UserAgent().random,'Referer': commicurl}url = commicurlresponse = requests.get(url,proxies=proxies,headers=headers)# 获取所有章节地址html = response.textprint(html)rexstr = commicurl.replace(main_url,'')+'\d.*?.html'step1_url = re.findall(rexstr, html)print(len(step1_url))for list_url in  step1_url :time.sleep(2)step2_url = 'https://www.manhuabei.com'+list_urlproxies_img = {'http': random.choice(proxies_list)}headers_img = {"User-Agent": UserAgent().random, 'Referer': url}response_img = requests.get(step2_url, proxies=proxies_img, headers=headers_img)html_img = response_img.textdom_img = etree.HTML(html_img)# 获取漫画章节namename  = dom_img.xpath('//div[@class="head_title"]/h1/a/text()')charpter = dom_img.xpath('//div[@class="head_title"]/h2/text()')# 特殊字符处理,防止文件目录创建失败charpter1 = re.sub('[\/:*?"<>|]', '', charpter[0])charpter=charpter1.replace('.','')if not os.path.exists(name[0]):os.mkdir(name[0])if not os.path.exists(name[0]+"/"+charpter):os.mkdir(name[0]+"/"+charpter)print(name)print(charpter)print(step2_url)# 浏览器静默模式。调试的时候可以关闭chrome_options = Options()chrome_options.add_argument('--headless')# 驱动地址需要自己去下对应浏览器的驱动,然后放到一个你自己方便的目录下,executable_path为绝对路径browser = webdriver.Chrome(executable_path="D:\\Python\\test\\chromedriver.exe", options=chrome_options)# 获取动态JS加载图片地址browser.get(step2_url)temp = browser.page_sourcedom = etree.HTML(temp)#获取图片url和页码img_url = dom.xpath('//div[@class="comic_wraCon autoHeight"]/div/img/@src')img_page = dom.xpath('//div[@class="comic_wraCon autoHeight"]/div/p/text()')# 无法读取图片处理if len(img_page) == 0:err_path = name[0] + '/' + 'filed.log'with open(err_path, 'w') as f:err = '无法读取'+charpter+'url:'+step2_urlf.write(err)continuepage_number = img_page[0]regex_page = '\d/'newstring = ''result_page = re.subn(regex_page, newstring, page_number)#清洗页码为intresult_pagefin = re.findall(r"(\d+).+?", result_page[0])print("总共"+result_pagefin[0]+'页')# 对页数进行循环,点击翻页for i in range(int(result_pagefin[0])):temp = browser.page_sourcedom = etree.HTML(temp)img_url = dom.xpath('//div[@class="comic_wraCon autoHeight"]/div/img/@src')# 替换前缀防止被编码,然后中文转码page_url = img_url[0].replace('https://','').replace('http://','')# 中文地址转码kw1 = urllib.parse.quote(page_url)page_url='https://'+kw1file_name = str(i + 1)time.sleep(1)if not os.path.exists(name[0] + '/' + charpter + '/' + file_name + '.jpg'):path = name[0] + '/' + charpter + '/' + file_name + '.jpg'with open(path, 'wb') as psave:proxies_jpg = {'http': random.choice(proxies_list)}headers_jpg = {"User-Agent": UserAgent().random,'Referer': page_url}response = requests.get(page_url, proxies=proxies_jpg, headers=headers_jpg)print("正在下载第" + charpter + '第' + str(i + 1) + "页")psave.write(response.content)else:print("第" + charpter +'第' +file_name+ '页已经存在')print("下一页")# 翻页browser.find_element_by_class_name('img_land_next').click()browser.quit()else:print("第" + charpter + '已经存在')

5手动输入查找指定漫画

手动输入关键字查找漫画,显示第一页内容(内容多少页可以添加循环输出全部,但是没必要就不写了),选择指定编号下载

from selenium import webdriver
from lxml import etree
import re
#加载驱动
browser = webdriver.Chrome(executable_path="D:\\Python\\test\\chromedriver.exe")
#获取网址
browser.get('https://www.manhuabei.com')
str1 = input("请输入需要查找的漫画名称:")
print("开始检索:", str1)
#模仿用户输入关键字
browser.find_element_by_xpath('//*[@id="keywords"]').send_keys(str1)#模仿用户点击按钮
browser.find_element_by_xpath('//*[@id="btnSearch"]').click()
temp = browser.page_source
dom = etree.HTML(temp)
url = dom.xpath('//*[@class="image-link"]/@href')
title = dom.xpath('//*[@class="image-link"]/@title')
print("搜索结果如下(仅显示第一页内容):")
for i in range(len(url)):print("编号: " +str(i)+'  漫画名称: '+title[i])str2 = input("请输入想要的漫画编号:")
print(title[int(str2)],url[int(str2)])

6成果展示

最终结果就是这样子了


7阅读体验提升

虽然下好了所有漫画,但是因为在不同的目录阅读还是挺麻烦的所以可以做个命名规划(PS:其实这步可以直接在主代码保存图片的时候命名规范的,但是博主当时没想到这点,只能事后做了 /(ㄒoㄒ)/~~!).重命名之后手动根据window搜索 *.jpg 复制所有的结果到新的目录就完成了,之后就可以无缝阅读了,0延迟。
代码运行后结果:
主目录搜索复制:

复制新文件夹。开始阅读

鼠标滚动无缝翻页:

import os.path
rootdir = "D:\Python\PyCharm 2019.3\project\女子学院的男生"                                   # 指明被遍历的文件夹
for parent,dirnames,filenames in os.walk(rootdir):     #三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字for filename in filenames:# 截取目录长度(原本dirnames应该直接返回当前目录的,但是这里不知道为什么返回空,所以多做一步)str_len = len(rootdir)# 当前目录即章节名称str1 = parent[str_len+1:]print(str1)print(filename)os.rename(os.path.join(parent,filename),os.path.join(parent,str1+filename)) #重命名

8完整代码

from fake_useragent import UserAgent
import random
import requests
import re
from lxml import etree
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import os
import time
import urllib.parse# 获取代理地址
def get_ip():# 国内打免费代理网站,可以换成其他,但是不同网站格式不同,需要自己修改regip表达式url = 'https://www.kuaidaili.com/free/inha/'# 获取多少页可以自己设置,但是不建议太多url_list = [url + str(i + 1) for i in range(1)]print(url_list)ip_list = []for i in range(len(url_list)):url = url_list[i]html = requests.get(url=url, ).textregip = '<td.*?>(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})</td>.*?<td.*?>(\d{1,5})</td>'matcher = re.compile(regip, re.S)ipstr = re.findall(matcher, html)# 设置等待时间减少被禁的概率time.sleep(1)for j in ipstr:ip_list.append(j[0] + ':' + j[1])print('共收集到%d个代理ip' % len(ip_list))print(ip_list)return ip_list# 验证代理可用性
def valVer(proxys):badNum = 0goodNum = 0good = []for proxy in proxys:try:proxy_host = proxyprotocol = 'https' if 'https' in proxy_host else 'http'proxies = {protocol: proxy_host}print('现在正在测试的IP:', proxies)# 测试的网站可以自由填写,最好是你目标网站,响应时间根据自己需要调整response = requests.get('https://www.manhuabei.com', proxies=proxies, timeout=4)if response.status_code != 200:badNum += 1print(proxy_host, 'bad proxy')else:goodNum += 1good.append(proxies)print(proxy_host, 'success proxy')except Exception as e:print(e)badNum += 1continueprint('success proxy num : ', goodNum)print(good)return good
# 图片下载
def downloadimg(commicurl,main_url):t_list = get_ip()proxies_list = valVer(t_list)print(proxies_list)# 随机proxies = {'http': random.choice(proxies_list)}headers = {"User-Agent": UserAgent().random,'Referer': commicurl}url = commicurlresponse = requests.get(url,proxies=proxies,headers=headers)# 获取所有章节地址html = response.textprint(html)rexstr = commicurl.replace(main_url,'')+'\d.*?.html'step1_url = re.findall(rexstr, html)print(len(step1_url))for list_url in  step1_url :time.sleep(2)step2_url = 'https://www.manhuabei.com'+list_urlproxies_img = {'http': random.choice(proxies_list)}headers_img = {"User-Agent": UserAgent().random, 'Referer': url}response_img = requests.get(step2_url, proxies=proxies_img, headers=headers_img)html_img = response_img.textdom_img = etree.HTML(html_img)# 获取漫画章节namename  = dom_img.xpath('//div[@class="head_title"]/h1/a/text()')charpter = dom_img.xpath('//div[@class="head_title"]/h2/text()')# 特殊字符处理,防止文件目录创建失败charpter1 = re.sub('[\/:*?"<>|]', '', charpter[0])charpter=charpter1.replace('.','')if not os.path.exists(name[0]):os.mkdir(name[0])if not os.path.exists(name[0]+"/"+charpter):os.mkdir(name[0]+"/"+charpter)print(name)print(charpter)print(step2_url)# 浏览器静默模式。调试的时候可以关闭chrome_options = Options()chrome_options.add_argument('--headless')# 驱动地址需要自己去下对应的浏览器的驱动,然后放到一个你自己方便的目录下,executable_path为绝对路径browser = webdriver.Chrome(executable_path="D:\\Python\\test\\chromedriver.exe", options=chrome_options)# 获取动态JS加载图片地址browser.get(step2_url)temp = browser.page_sourcedom = etree.HTML(temp)#获取图片url和页码img_url = dom.xpath('//div[@class="comic_wraCon autoHeight"]/div/img/@src')img_page = dom.xpath('//div[@class="comic_wraCon autoHeight"]/div/p/text()')# 无法读取图片处理if len(img_page) == 0:err_path = name[0] + '/' + 'filed.log'with open(err_path, 'w') as f:err = '无法读取'+charpter+'url:'+step2_urlf.write(err)continuepage_number = img_page[0]regex_page = '\d/'newstring = ''result_page = re.subn(regex_page, newstring, page_number)#清洗页码为intresult_pagefin = re.findall(r"(\d+).+?", result_page[0])print("总共"+result_pagefin[0]+'页')# 对页数进行循环,点击翻页for i in range(int(result_pagefin[0])):temp = browser.page_sourcedom = etree.HTML(temp)img_url = dom.xpath('//div[@class="comic_wraCon autoHeight"]/div/img/@src')# 替换前缀防止被编码,然后中文转码page_url = img_url[0].replace('https://','').replace('http://','')# 中文地址转码kw1 = urllib.parse.quote(page_url)page_url='https://'+kw1file_name = str(i + 1)time.sleep(1)if not os.path.exists(name[0] + '/' + charpter + '/' + file_name + '.jpg'):path = name[0] + '/' + charpter + '/' + file_name + '.jpg'with open(path, 'wb') as psave:proxies_jpg = {'http': random.choice(proxies_list)}headers_jpg = {"User-Agent": UserAgent().random,'Referer': page_url}response = requests.get(page_url, proxies=proxies_jpg, headers=headers_jpg)print("正在下载第" + charpter + '第' + str(i + 1) + "页")psave.write(response.content)else:print("第" + charpter +'第' +file_name+ '页已经存在')print("下一页")# 翻页browser.find_element_by_class_name('img_land_next').click()browser.quit()else:print("第" + charpter + '已经存在')
if __name__ == '__main__':browser = webdriver.Chrome(executable_path="D:\\Python\\test\\chromedriver.exe")# 获取网址main_url = 'https://www.manhuabei.com'browser.get(main_url)str1 = input("请输入需要查找的漫画名称:")print("开始检索:", str1)# 模仿用户输入关键字browser.find_element_by_xpath('//*[@id="keywords"]').send_keys(str1)# 模仿用户点击按钮browser.find_element_by_xpath('//*[@id="btnSearch"]').click()temp = browser.page_sourcedom = etree.HTML(temp)url = dom.xpath('//*[@class="image-link"]/@href')title = dom.xpath('//*[@class="image-link"]/@title')print("搜索结果如下(仅显示第一页内容):")for i in range(len(url)):print("编号: " + str(i) + '  漫画名称: ' + title[i])str2 = input("请输入想要的漫画编号:")print(title[int(str2)], url[int(str2)])commicurl= url[int(str2)]downloadimg(commicurl,main_url)

9感言

刚学也就这能到这一步了,代码比较简陋哈。整体爬取速度还是比较慢的,主要还是后台启动浏览器花费时间较大,这个我也不知道怎么处理了。
另外希望大家爬取的时候多设置一些等待时间,不要对人家网站造成影响

10声明

转载请注明出处,代码只作为学习交流使用,如有侵权,请联系删除!

python 爬虫+selenium 全自动化下载JS动态加载漫画相关推荐

  1. Python爬虫——Selenium 简介和下载

    文章目录 Python爬虫--Selenium 简介和下载 1.Selenium 简介 2.Selenium 下载安装 3.Selenium 简单使用 Python爬虫--Selenium 简介和下载 ...

  2. JS动态加载脚本及对动态脚本内方法的调用

    JS动态加载脚本及对动态脚本内方法的调用 摘要 JS动态加载脚本及对动态脚本内方法的调用 JS 动态 添加脚本 按需加载 首先我们需要一个被加载的js文件,我在一个固定文件夹下创建了一个package ...

  3. 转:JS动态加载JS

    JS动态加载JS 1.直接document.write <script language="javascript"> document.write("< ...

  4. js动态加载css文件和js文件的方法

    今天研究了下js动态加载js文件和css文件的方法. 网上发现一个动态加载的方法.摘抄下来,方便自己以后使用 [code lang="html"] <html xmlns=& ...

  5. 10丨Python爬虫:如何自动化下载王祖贤海报?

    爬虫的流程 相信你对"爬虫"这个词已经非常熟悉了,爬虫实际上是用浏览器访问的方式模拟了访问网站的过程,整个过程包括三个阶段:打开网页.提取数据和保存数据. 在 Python 中,这 ...

  6. Python3 网络爬虫:漫画下载,动态加载、反爬虫这都不叫事

    一.前言 作者:Jack Cui 经过上两篇文章的学习,Python爬虫三步走:发起请求.解析数据.保存数据,已经掌握,算入门爬虫了吗? 不,还远远不够!只掌握这些,还只能算门外汉级别. 今天,就来带 ...

  7. Python3网络爬虫:漫画下载,动态加载、反爬虫这都不叫事!

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 十年磨一剑,霜寒未曾试.今日把君问 ...

  8. python 爬虫 快看漫画整站爬取(解决动态加载漫画图片地址、漫画图片合成长图、图片文件排序等问题)

    运行结果: 这个是爬取的目标 爬取之后建立文件夹,合成长图之后删除文件夹 这里仅仅做几组演示, 由于合成的图片有单列长度限制,所有拆分成两列 开始: 首先打开网站,找到某个漫画,发现点鼠标右键不可以, ...

  9. 从零开始学爬虫系列3:漫画下载,动态加载、反爬虫这都不叫事!

    1 前言 前文回顾: 从零开始学爬虫系列1:初识网络爬虫之夜探老王家 从零开始学爬虫系列2:下载小说的正确姿势 经过上两篇文章的学习,爬虫三步走:发起请求.解析数据.保存数据,已经掌握,算入门爬虫了吗 ...

最新文章

  1. Android Gradle基础实践
  2. MAT之PSO:利用PSO实现对一元函数y = sin(10*pi*x) ./ x进行求解优化,找到最优个体适应度
  3. aliyun maven 添加jar_gradle添加阿里云maven库
  4. linux 普通io实现pwm,用普通IO口做PWM输出 - 51单片机 - 电子工程世界-论坛 - 手机版...
  5. Python Tuple:一文彻底粉碎元组
  6. VS2010开发应用程序读写注册表
  7. 由于找不到MSVCP20.dll,无法继续执行代码
  8. 试论《华严经》来历的可信
  9. MFC程序中使用QT开发界面
  10. C语言中将字符串转换为数字
  11. springboot中的pom文件详解
  12. 手机端自动播放网页背景音乐代码
  13. IP 地址由网络和主机两部分标识组成
  14. Linux系列:TCP报文格式
  15. oeasy教您玩转python - 012 - # 刷新时间
  16. 开发后台界面用 div好,还是frame 框架 好?
  17. 云仓代发货到底是什么?
  18. 【CQgame】[幸运方块 v1.1.3] [Lucky_Block v1.1.3]
  19. 谋定农民丰收节交易会-李加映:功能性农业·农业大健康大会
  20. 爆强笑话,笑不翻你才怪我吐血!!!

热门文章

  1. 荣耀magic5pro上手体验全面测评是智商税吗?
  2. python 各种包下载大全网址
  3. 第一篇:ROS机器人的多系统的移植(包括Ubuntu、ROS安装)--Kinetic
  4. linux fsck原理,文件系统及fsck设计思路理解
  5. JavaSE_集合框架_3
  6. C++中的数组,指针解析
  7. java kt_我的KT库之-----认识KT
  8. JS实现单表代换密码加密
  9. HTML+CSS+JS+Jquery面试题
  10. 性别后台01前端男女显示