系列之二——爬取动态加载网页的图片
在上一篇中我们提到了如何爬取静态网页,静态网页方便爬取是因为我们查看网页元素然后直接爬取信息就可以。
然而动态网页比如常见的js动态生成,用静态方法访问网站并且获取html时,js动态生成的这一部分还没有生成,所以静态方法获取不了这一部分信息。
我采用的例子是动漫之家(仅学习用,若涉及侵权请联系我,我会下架本文章)
我使用的是selenium的webdriver,我个人理解webdriver是模拟用户用浏览器访问网络,只不过不是用户亲自用鼠标是双击,而是用的代码。在这里本人使用的是Firefox浏览器。
webdriver的使用方法非常简单
dr = webdriver.Firefox()
dr.get(url)
这样我们运行代码的话就会自动弹出一个火狐浏览器,并且该浏览器正在访问我们输入的url
但是我们总不想当我们完成这个程序时,每次用户使用都会弹出浏览器,能不能让它自己静静的运行,不弹出来呢
答案是可以的,我们可以使用无头浏览器,只需要简单的设置option就可以做到
#无头浏览器 这样浏览器就不会弹出
options = Options()
options.add_argument('--headless')
dr = webdriver.Firefox(options=options)
接下来的步骤与静态网页类似,只不过我们用的是dr变量的find_elements系列方法。
扫描二维码关注公众号,回复:
5426733 查看本文章
具体代码如下
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
import queue
import os
from urllib.request import build_opener
from urllib.request import install_opener
from urllib.request import urlretrieve
import threading
#此份代码用---来连接划分漫画的不同属性
def getComicUrl(url,source,q):
try:
response = requests.get(url)
response.encoding = 'utf-8'
page = BeautifulSoup(response.text, "lxml")
total_html = page.find(name='div',attrs={"class":"cartoon_online_border"})
#无头浏览器 这样浏览器就不会弹出
options = Options()
options.add_argument('--headless')
dr = webdriver.Firefox(options=options)
# 共有多少话
for i in total_html.find_all('li'):
href = i.a['href']
href=source+href
# 每话进行下载
print(href)
# 进入每一话页面 由于dmzj为js动态加载页面,所以用webdriver来获取
each_url = href
dr.get(url=each_url)
# 找到该话总页数
pages =dr.find_elements_by_xpath("//div[@class='btmBtnBox']/select/option")
tempNum=len(pages)
# 获取漫画名字与话数
name = dr.find_elements_by_xpath("//div[@class='display_middle']/h1/a")[0].text\
+dr.find_elements_by_xpath("//div[@class='display_middle']/span")[0].text
for page in pages:
page_url="https:"+page.get_attribute("value")
q.put(name+"---"+page_url+"---"+page.text)
dr.close()
dr.quit()
except requests.exceptions.ConnectionError:
print("输入url错误")
return
def dest_establish(dest):
if not os.path.exists(dest):
os.makedirs(dest)
def downloadEveryPage(q,file_path):
e=q.get()
name=e.split('---')[0]
source_pic=e.split('---')[1]
ye_num=e.split('---')[2]
# 下载
filename=file_path+"/" + name + " " + ye_num + ".jpg"
if not os.path.exists(filename):
urlretrieve(url=source_pic, filename=filename)
print("{name} {pageNum} 已经下载".format(name=name, pageNum=ye_num))
def download(q,file_path):
#简单的urlopener不能打开带cookie或者需要验证的高级网页,但是build_opener就支持,若是用
#普通的urlopener此处会有ERROR 403
opener=build_opener()
opener.addheaders = [('User-Agent',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36'),
("Referer", "https://manhua.dmzj.com/")]
install_opener(opener)
while True:
downloadEveryPage(q,file_path)
q.task_done()
def start_download_dmzj(url,file_path):
# url = "https://manhua.dmzj.com/meikongjiejieyutianranmeimei"
# url="https://manhua.dmzj.com/newgame"
print("开始下载")
source = "https://manhua.dmzj.com"
q = queue.Queue(999)
getComicUrl(url,source,q)
threadNum = 7
for i in range(0, threadNum):
downloadThread = threading.Thread(target=download,args=(q,file_path))
downloadThread.setDaemon(True)
downloadThread.start()
q.join()