我因为做视频的需要所以想下一些漫画的图片,但是大家都知道想搞一堆jpg格式的漫画图片在正规渠道继续不太可能。所以我们就选择使用python爬取
本来我是想那某个B开头的网站开刀,但是很遗憾,他们的漫画每一页都是动态网页刷新图片,并且,从网络流翻出的图片的源文件的地址,会发现他们都被加密了(个人感觉是32位MD5加密),我们完全没办法破解并找到其中的规律。
链接实例:blob:https://manga.bilibili.com/56e70399-4d12-426d-9653-4deb43a4161d
所以我们只能放弃B站,去找一个相对小一点的网站。不过也让我找到了,虽然他同样使用AJAX技术和加密,但是好在在浏览器解析之后,他形成的动态网页能找到img的tag(哔站是canvas)这就让我们有了可乘之机,我们可以利用selenium来模拟浏览器解析网页,然后用BeautifulSoup获取需要的tag节点,以及属性,再利用request获取资源。
首先,我们需要安装这三个库
pip install requests
pip install beautifulsoup4
pip install selenium
然后需要安装你的浏览器对应的浏览器驱动
请参考:https://liushilive.github.io/github_selenium_drivers/index.html
然后需要引用库和相应的浏览器驱动
import requests
from selenium import webdriver
from bs4 import BeautifulSoup
browser = webdriver.Firefox()
我们已经有明显的思路了,接下来就是对需要爬取的网页作“个性化”处理。值得一提的是,我们平时常用的改变url的值并重新请求的方法并不太适用于这里,所以我们需要用模拟鼠标点击的方式来进入下一页查找。
i=0
const=5051362
url="https://www.u17.com/chapter/720151.html#image_id=5051362"
browser.get(url) #请求服务器处理后的网页内容
while i<100:
#print(browser.current_url)
html = BeautifulSoup(browser.page_source, "lxml") #使用bs解析网页
con=html.find('img',class_='image_cache loading cur_img') #获取需要的tag
#因为获取相应的链接可能不存在所以要用一个if
if con != None:
img=con['src']
#print(str(img))
stri="./img/"+str(i)+".png"
response = requests.get(img)
with open(stri, 'wb') as fi:
fi.write(response.content) #存储图片
else:
#loading image_cache
img=html.find('img',class_='loading image_cache')['src']
#print(str(img))
stri="./img/"+str(i)+".png"
response = requests.get(img)
with open(stri, 'wb') as fi:
fi.write(response.content)
#<div id="mask"> 第一次进入会有悬浮框,点击关掉
if i==0:
mask=browser.find_element_by_id('mask')
mask.click()
btn = browser.find_element_by_class_name ('next') #翻页
btn.click()
i+=1
但是这个代码在爬取这个网页的时候也是会有一个问题,就是请求的tag可能会不存在,这可能于请求时间有关,大家可以加一个sleep方法来延长一下在页面停留的时间。如果有爬虫大佬请指点一下我这个憨憨😂