风之动漫爬虫
平时经常在网上在线看漫画,常去风之动漫。写了一个爬虫来下载漫画。漫画画面所在的内容并不是一开始就加载好的:前两个html里面没有漫画图片地址。图片地址由js文件得出。可以使用selenium来模拟浏览器工作。安装selenium并不难。但需要下一个配套的driver,我是firefox的浏览器,下了一个geckodriver。谷歌浏览器得注意浏览器版本啥的,具体可参见: https://blog.csdn.net/qq_42543250/article/details/81290876. 其实调firefox主要是为了方便调试,自己看着清楚,调试完成后可以换成PhantomJS(官网下载,要加环境变量),一个没有图形界面的浏览器,反正爬的过程也不会去看。。。
使用的库:selenium, requests, BeautifulSoup, os
首先是下载图片,这个挺常用的。打开到一个图片的源地址:
这个网页。爬取方法就是:把这个页面以二进制文件形式存下来,然后改后缀即可。下载其它的文件也可以使用同种方法。见down_img函数。
接下来是找到这个图片的源地址的方法。回到漫画所在页面:这个地方需要用selenium模拟浏览器进行。为了方便看,先用有图形界面的浏览器。(要安装geckodriver,没安就算了)
browser = webdriver.Firefox()
这时候应该会弹出一个浏览器的界面。Selenium用法还是很人性化的,可以模拟各种操作:单击双击输入文本……推荐b站上的av63536266,跟着里面selenium那一节走一遍,应该就会了,也可参考官方文档:https://python-selenium-zh.readthedocs.io/zh_CN/latest/。
这里使用的是利用点击漫画位置翻页。各种找网页位置用的是css选择器,可参考:https://www.w3school.com.cn/cssref/css_selectors.asp。页面加载需要时间,这就需要等待。这里等待采用显示等待,隐式等待一般会比较慢,因为它会等页面完全加载完。具体用法可以参考官方文档的第5节显示等待的那个示例。然后写个循环一张图一张图地下载就好了。见函数down_chapter。
最后是转到要下载的漫画的目录页面爬取各话信息。打开如下界面:
发现信息都在html上,Requests+Beautifulsoup解决问题。
完整代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import requests
from bs4 import BeautifulSoup
import os
from multiprocessing import Pool
base_dir = './巨人/'
def down_img(url, save_dir):
r = requests.get(url)
with open(save_dir, 'wb') as f:
f.write(r.content)
def down_chapter(url):
lst = []
browser = webdriver.PhantomJS()
try:
browser.get(url)
element = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mhpic')))
title = browser.find_element(By.CSS_SELECTOR, '#pjax-container h1').text
print(title)
lst.append(browser.find_element(By.CSS_SELECTOR, '#mhpic').get_attribute('src'))
while browser.find_elements(By.CSS_SELECTOR, '#mhimg0 a'):
botton = browser.find_element(By.CSS_SELECTOR, '#mhimg0 a')
botton.click()
element = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mhpic')))
lst.append(browser.find_element(By.CSS_SELECTOR, '#mhpic').get_attribute('src'))
finally:
browser.close()
if not os.path.exists(base_dir + title + '/'):
os.mkdir(base_dir + title + '/')
for i in range(len(lst)):
down_img(lst[i], base_dir + title + '/' + str(i) + '.jpg')
return lst
if __name__ == '__main__':
if not os.path.exists(base_dir):
os.mkdir(base_dir)
base_url = 'https://manhua.fzdm.com/39/'
r = requests.get(base_url)
soup = BeautifulSoup(r.text, 'lxml')
chapter_lst = [base_url + chapter['href'] for chapter in soup.select('.pure-u-1-2 a')]
pool = Pool()
pool.map(down_chapter, chapter_lst)
爬虫结果:
p.s.听说谏山创立了个flag,要今年完结巨人,有点小期待。
更多推荐




所有评论(0)