一切都要從一只蝙蝠說起。。
因為疫情原因,這個月遠程辦公(摸魚),看漫畫花了1000多大洋,看着自己的支付寶余額,起了白嫖的邪念。。
網上有些漫畫網站,點擊下一頁的時候,會跳出某些網站,十分不便,而且每次換頁都需要點擊,所以我決定把漫畫全都爬下來,每章拼接成一張長圖,可以看得舒服一些
工具:pycharm
工具包:scrapy,re,urllib,os
一.創建爬蟲程序:
1.scrapy startproject manhua2
2.cd 到目錄內
3.scrapy genspider manhua fzdm.com /漫畫為spider名稱 ,后面的為漫畫網站網址
二.修改配置和建立啟動文件
setting頁面里面修改:
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 1
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'
}
啟動文件:
from scrapy import cmdline cmdline.execute("scrapy crawl manhua".split())
三.寫spider
打開這個py文件
打開我想看的漫畫地址,填入start_urls
我是從126話開始看的,所以初始地址為126
分析一下頁面:
整頁的漫畫都是一個jpg,那就好辦了,只要找到這個圖片的src就行了,而且這個元素還有ID,很容易找
在打印的response.body里面,找到該元素
明顯返回的數據和我們在頁面自己看見的src不一樣,既然不直接給,就自己拼接好了,由圖可知,知道mhpicurl就能拼出src
所以我們要找出來mhpicurl的賦值在哪里,在結果里面搜索mhpicurl,找到賦值公式發現還要找到mhss和mhurl
繼續找mhss和mhurl
mhss:
mhurl:
所以自己拼接一下得到的就是http://p2.manhuapan.com/2014/12/071250072.jpg,也就是漫畫圖片的地址
后來我發現,我看的這本漫畫的圖片地址只有mhurl不一樣,所以我只需要找到mhurl,就能得到圖片的src
mhurl = re.findall('mhurl="(.*?)\.jpg"', str(response.body))[0] img_scr = 'http://p2.manhuapan.com/' + mhurl + ".jpg"
找到這章漫畫之后,我們需要獲取下一話的信息
在不是最后一頁的情況下:
在是最后一頁的情況下;
也就是說,我們只需要獲取div里面的最后一個a標簽即可
next_page = response.css(".navigation a::attr(href)").extract()[-1]
然后就是下載圖片鏈接了,這里我比較懶,直接用的
urllib.request.urlretrieve(圖片鏈接, 圖片位置)
下面是spider下的完整代碼 (寫的比較匆忙,有些地方不是很嚴謹)

# -*- coding: utf-8 -*- import scrapy import re import urllib.request import os class ManhuaSpider(scrapy.Spider): name = 'manhua' allowed_domains = ['fzdm.com'] start_urls = ['https://www.fzdm.com/manhua/42/126/index_0.html'] def parse(self, response): print(response.body) mhurl = re.findall('mhurl="(.*?)\.jpg"', str(response.body))[0] img_scr = 'http://p2.manhuapan.com/' + mhurl + ".jpg" print(img_scr) count=re.findall('https://www.fzdm.com/manhua/42/(.*?)/index_(.*?).html',response.url)[0] index=count[1] count=count[0] isExists = os.path.exists(r"C:\Users\rtdr\Desktop\test\%s" % count) if not isExists: os.makedirs(r"C:\Users\rtdr\Desktop\test\%s" % count) pic_name = r"C:\Users\rtdr\Desktop\test\%s\%s.jpg" %(count,index) urllib.request.urlretrieve(img_scr, pic_name) next_page = response.css(".navigation a::attr(href)").extract()[-1] # next_page=re.findall('href="(.*?)"',str(next_page))[0] if next_page is not None: next_page = response.urljoin(next_page) if not str(next_page).endswith(".html"): print(next_page) next_page=next_page+'/index_0.html' yield scrapy.Request(next_page, callback=self.parse)
四.拼接圖片
爬取完成之后,文件夾應該如下圖所示
里面的圖片應該為一張一張的小圖片:
我們用PIL模塊將圖片拼接,這個過程很簡單,我就直接放代碼了:
import os import PIL.Image as Image for i in range(172,191): path=r'C:\Users\rtdr\Desktop\test\%s' %i dirs=os.listdir(path) width=0 high=0 li=[0] for k in range(len(dirs)): pic_path = path + '\\%s.jpg' % k fromImage = Image.open(pic_path) tem_w,tem_y=fromImage.size if tem_w>width: width=tem_w high+=tem_y li.append(high) toImage = Image.new('RGB', (width, high)) for k in range(len(dirs)): pic_path=path+'\\%s.jpg' %k print(pic_path) fromImage = Image.open(pic_path) toImage.paste(fromImage,(0, li[k])) toImage.save(r'C:\Users\rtdr\Desktop\test\拼接后圖片\%s.jpg' %i)
運行后效果如下:
然后我打包發到QQ看下效果
拼接正常,全程長圖,右划下一章,完成。
ps:等我發工資會補票的,大家最好還是支持正版啊。。我做這個是出於技術o( ̄▽ ̄)d