零基础,一直十分想要下载腾讯动漫上的漫画,之前找了好几个爬虫总是运转的不太好,有一个爬虫能用,但是好像最近腾讯又改动了页面导致匹配出现了点问题。
于是一边查一边复制粘贴一边自己摸索一天半搞了这个弟弟爬虫,基本等于按键精灵,不能保障完全下完,速度慢,一个页面一直走。
但是毕竟是自己写的第一个爬虫,达到了目的,所以还是很开心!
另外,我下载漫画只是为了后续可能视频剪辑会用,请尊重版权,喜欢的漫画请购买正版~
用户登陆
如果是爬取非vip漫画不需要登陆,如果爬取vip漫画需要一个购买完要爬的漫画的账号来进行登陆
腾讯系列的网站都差不多,所以抄了网上别人的QQ空间模拟登陆:https://blog.csdn.net/crjmail/article/details/81666284
#第一次通过send_keys向输入框发送用户名密码登录
driver1.switch_to.frame('iframeAll') # 切换到登陆界面
driver1.find_element_by_id('switcher_plogin').click() # 选择帐号密码登陆
time.sleep(0.5)
driver1.find_element_by_name('u').clear()
time.sleep(0.5)
driver1.find_element_by_name('u').send_keys('账号') # 此处输入你的QQ号
time.sleep(0.5)
driver1.find_element_by_name('p').clear()
time.sleep(0.5)
driver1.find_element_by_name('p').send_keys('密码') # 此处输入你的QQ密码
time.sleep(1)
driver1.find_element_by_id('login_button').click() # 点击登陆按键
滚屏漫画加载
腾讯动漫是采用滚屏满满加载的方式,所以这边模拟了下滑操作,并且这个操作没有任何保证,就是慢慢下滑
如果想要稳妥就是每次下滑的少一点,下滑次数多一点这样子慢慢来
这一部分还有待改进的空间,我有尝试过网上一位大佬的方法,大概是不断前后滚屏,判断元素是否load,不过失败了。所以就还是这个弟弟做法。这个方法对于更新页数稳定的漫画还是可以的。
for i in range(0,30):
driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
time.sleep(2)
提取标题设置存储路径
#提取标题
title = soup.title.string
print(title)
titlelist = title.split('-')
title = titlelist[0]
titlelist = title.split('》')
title = titlelist[1]
x = 0
path = "comic/yiren/"+title+"/" # 存储每章节漫画路径
if (os.path.exists(path)):#判断文件夹是否存在,存在则删除再创建
shutil.rmtree(path)
time.sleep(5)
os.mkdir(path)
else:
os.mkdir(path)
下载漫画
没有很认真的匹配正则式所以里面有点横条小图
imglist = soup.find_all("img", {"src": re.compile('.*?\.jpg/0')}) # 查找图片
for img in imglist:#下载图片
print(img['src'])
r = requests.get(img['src'], stream=True)
image_name = x
with open(path+'%s.jpg' % image_name, 'wb') as f:
for chunk in r.iter_content(chunk_size=128):
f.write(chunk)
print('Saved %s' % str(image_name))
x += 1
点击下一页
因为理想状态下是滚屏到了页面底部,所以可以直接点击下一页
比较傻的办法,但是好处就是不用cookie,第一部登陆后一键到底,但是坏处就是出现超页的时候会找不到元素而中断。
driver1.find_element_by_xpath("//*[@id='mainControlNext']").click()
完整代码
import time #用来延时
import re,os
import requests
from selenium import webdriver
import selenium.webdriver.common.keys as keys
from bs4 import BeautifulSoup
import shutil
def downloadimg():
option=webdriver.ChromeOptions()
option.add_argument('headless') # 设置option隐藏
print("启动")
driver1 = webdriver.Chrome(chrome_options=option)
driver1.get("https://ac.qq.com/ComicView/index/id/531490/cid/453")#下载漫画的连接入口
driver1.maximize_window()
time.sleep(3)
****需要VIP的漫画需要登陆并购买好完整漫画***********
#第一次通过send_keys向输入框发送用户名密码登录
driver1.switch_to.frame('iframeAll') # 切换到登陆界面
driver1.find_element_by_id('switcher_plogin').click() # 选择帐号密码登陆
time.sleep(0.5)
driver1.find_element_by_name('u').clear()
time.sleep(0.5)
driver1.find_element_by_name('u').send_keys(' ') # 此处输入你的QQ号
time.sleep(0.5)
driver1.find_element_by_name('p').clear()
time.sleep(0.5)
driver1.find_element_by_name('p').send_keys(' ') # 此处输入你的QQ密码
time.sleep(1)
driver1.find_element_by_id('login_button').click() # 点击登陆按键
****支持正版漫画**********
for j in range(0,100):
time.sleep(2)
for i in range(0,30):
driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
time.sleep(2)
soup = BeautifulSoup(driver1.page_source, "html.parser")
#提取标题
title = soup.title.string
print(title)
titlelist = title.split('-')
title = titlelist[0]
titlelist = title.split('》')
title = titlelist[1]
#print(soup)
imglist = soup.find_all("img", {"src": re.compile('.*?\.jpg/0')}) # 查找图片
#print(imglist)
x = 0
path = "comic/yiren/"+title+"/" # 存储每章节漫画路径
if (os.path.exists(path)):#判断文件夹是否存在,存在则删除再创建
shutil.rmtree(path)
time.sleep(5)
os.mkdir(path)
else:
os.mkdir(path)
for img in imglist:#下载图片
print(img['src'])
r = requests.get(img['src'], stream=True)
image_name = x
with open(path+'%s.jpg' % image_name, 'wb') as f:
for chunk in r.iter_content(chunk_size=128):
f.write(chunk)
print('Saved %s' % str(image_name))
x += 1
driver1.find_element_by_xpath("//*[@id='mainControlNext']").click()
if __name__ == '__main__':
downloadimg()
一些尝试过却没有用上的方法
1.滚屏
js = "var q=document.body.scrollTop=10000" #chrome浏览器,滚到底部失败,无反应
driver1.execute_script(js)
2.判断元素是否load来判断是否加载完毕,配合滚屏操作
time_start=datetime.datetime.now()
while (datetime.datetime.now()-time_start).total_seconds()<500:
items = self.driver.find_elements_by_xpath("/html/body/div[@id = 'mainView']/ul/li/img")
try:
for index, item in enumerate(items):
if item.get_attribute("class") != 'loaded':
self.driver.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_UP)
self.driver.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_UP)
self.driver.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
self.driver.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
self.driver.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
self.driver.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
self.driver.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
print('pic index: {}/{} not loaded, this is the {}th time'.format(index, len(items), index))
time.sleep(0.5)
break
else:
break
except Exception as e:
print(e)
break
items = self.driver.find_elements_by_xpath("/html/body/div[@id = 'mainView']/ul/li/img")
3.使用cookie
第一种方法成功过一段时间,之后失效,尝试第二种方法,失败
https://www.cnblogs.com/cnhkzyy/p/9260373.html