使用Scrapy对dm5网站进行抓取,但是pipeline无法对图片进行储存,可打印出文件路径
爬虫文件
import scrapy
from dm5pro.items import Dm5ProItem
import execjs
import re
from w3lib import url as wurl
class Dm5Spider(scrapy.Spider):
name = 'dm5'
# allowed_domains = ['www.xxx.com']
start_urls = ['http://www.dm5.com/manhua-list/']
url = 'http://www.dm5.com/manhua-list-p{}/'
def parse(self, response):
li_list = response.xpath('/html/body/section[2]/div/ul/li')
for li in li_list:
comic_title = li.xpath('./div/div[1]/h2/a/text()').extract_first()
comic_url = 'http://www.dm5.com/' + li.xpath('./div/div[1]/h2/a/@href').extract_first()
item = Dm5ProItem()
item['comic_title'] = comic_title
yield scrapy.Request(comic_url, callback=self.chapter_parse, meta={'item': item})
def chapter_parse(self, response):
li_list = response.xpath('//*[@id="detail-list-select-1"]/li')
for li in li_list:
chapter_name = li.xpath('./a/text()').extract_first()
chapter_url = 'http://www.dm5.com/' + li.xpath('./a/@href').extract_first()
item = response.meta['item']
item['chapter_name'] = chapter_name.strip()
yield scrapy.Request(chapter_url, callback=self.content_parse, meta={'item': item})
def content_parse(self, response):
page_text = response.text
cid = re.findall('var DM5_CID=(.+?);', page_text)[0].strip()
page_count = re.findall('var DM5_PAGEPCOUNT =(.+?);', page_text)[0].strip()
_mid = re.findall('var DM5_MID=(.+?);', page_text)[0].strip()
_dt = re.findall('var DM5_VIEWSIGN_DT="(.+?)";', page_text)[0].strip()
_sign = re.findall('var DM5_VIEWSIGN="(.*?)";', page_text)[0].strip()
page = 1
while page < int(page_count):
url = f'{response.url}chapterfun.ashx?cid={cid}&page=1&key=&language=1>k=6&_cid={cid}&_mid={_mid}&_dt={_dt}&_sign={_sign}'
yield scrapy.Request(url,callback=self.content_parse_2,meta={'item':response.meta['item']})
def content_parse_2(self, response):
js_code = response.text
img_urls = execjs.eval(js_code)
img_url = img_urls[0]
item = response.meta['item']
item['src'] = img_url
img_name = wurl.parse_url(img_url).path.split('/')[-1]
item['img_name'] = img_name
yield item
items文件
import scrapy
class Dm5ProItem(scrapy.Item):
# define the fields for your item here like:
comic_title = scrapy.Field()
chapter_name = scrapy.Field()
src = scrapy.Field()
img_name = scrapy.Field()
pipeline.py
import scrapy
from scrapy.pipelines.images import ImagesPipeline
class Dm5ProPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
yield scrapy.Request(item['src'],meta={'item':item})
def file_path(self, request, response=None, info=None):
filename = 'full/%s/%s/%s' % (request.meta['item']['comic_title'], request.meta['item']['chapter_name'], request.meta['item']['img_name'])
print(filename)
# print(f"{request.meta['item']['comic_title']}{request.meta['item']['chapter_name']}, {request.meta['item']['img_name']}已下载完毕")
# img_name = request.meta['item']['img_name']
# print(img_name)
return filename
def item_completed(self, results, item, info):
return item
settings.py
BOT_NAME = 'dm5pro'
SPIDER_MODULES = ['dm5pro.spiders']
NEWSPIDER_MODULE = 'dm5pro.spiders'
LOG_LEVEL = 'ERROR'
IMAGES_STORE = './dm5imags/'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20",
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {
'dm5pro.pipelines.Dm5ProPipeline': 300,
}
控制台打印数据
full/怪兽8号/第1话/1_4067.jpg
full/拳愿奥米伽/第56话 代表决定/1_5025.jpg
full/拳愿奥米伽/第56话 代表决定/1_1796.jpg
full/拳愿奥米伽/第56话 代表决定/1_7146.jpg
full/因为成了魔王的手下所以要毁掉原作/第1话/1_1776.jpg
full/觉醒开挂技能【死者苏生】,然后将古老的魔王军复活了/第1话/1_5355.jpg
full/拳愿奥米伽/第56话 代表决定/1_9932.jpg
full/转生剑圣想要悠闲地生活/第1话 剑圣姬的护卫/1_1164.jpg
full/物理魔法使马修/第9话/1_8784.jpg
full/物理魔法使马修/第9话/1_6847.jpg
full/身为『普通』公爵千金的我,才不会成为恶役!/第1话/1_8022.jpg
full/身为『普通』公爵千金的我,才不会成为恶役!/第1话/1_8544.jpg
full/女儿的朋友/第27话 反常与正常/1_1453.jpg
full/身为『普通』公爵千金的我,才不会成为恶役!/第1话/1_6013.jpg
full/身为『普通』公爵千金的我,才不会成为恶役!/第1话/1_7939.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_5155.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_4763.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_3855.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_3603.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_5353.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_9599.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_9177.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_8371.jpg
full/女儿的朋友/第27话 反常与正常/1_2871.jpg
full/女儿的朋友/第27话 反常与正常/1_6726.jpg
full/女儿的朋友/第27话 反常与正常/1_6413.jpg
full/女儿的朋友/第27话 反常与正常/1_7461.jpg
full/女儿的朋友/第27话 反常与正常/1_8771.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_7061.jpg
full/女儿的朋友/第27话 反常与正常/1_6704.jpg
full/女儿的朋友/第27话 反常与正常/1_8226.jpg
full/女儿的朋友/第27话 反常与正常/1_1346.jpg
^Cfull/女儿的朋友/第27话 反常与正常/1_8037.jpg
full/女儿的朋友/第27话 反常与正常/1_3129.jpg
^C^C^Cfull/女儿的朋友/第27话 反常与正常/1_3134.jpg
full/女儿的朋友/第27话 反常与正常/1_9994.jpg
bogon:dm5pro licongjian$ scrapy crawl dm5
full/月入50万毫无人生目标的隔壁大姐姐每月花30万雇我跟他说“欢迎回家”的工作太开心了/第1话 邻家的早乙女小姐/1_5816.jpg
full/怪兽8号/第1话/1_5600.jpg
full/拳愿奥米伽/第56话 代表决定/1_6065.jpg
full/我们在秘密交往/第0话/1_9532.jpg
full/我们在秘密交往/第0话/1_4130.jpg
full/拳愿奥米伽/第56话 代表决定/1_1774.jpg
full/拳愿奥米伽/第56话 代表决定/1_1796.jpg
full/物理魔法使马修/第9话/1_6847.jpg
full/异世界默示录米诺戈拉/第1话 NewGame/1_6485.jpg
full/拳愿奥米伽/第56话 代表决定/1_5025.jpg
full/物理魔法使马修/第9话/1_1112.jpg
full/转生剑圣想要悠闲地生活/第1话 剑圣姬的护卫/1_9728.jpg
full/拳愿奥米伽/第56话 代表决定/1_1253.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_5155.jpg
full/女儿的朋友/第27话 反常与正常/1_1453.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_3855.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_4763.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_3603.jpg
full/物理魔法使马修/第9话/1_8784.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_9177.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_5353.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_9599.jpg
full/来到异世界的我靠着神速和万能技能进行着旅行/第1话/1_8371.jpg
full/隔壁的大人/第1话 大人的谜团/1_1388.jpg
请各位大佬帮忙看下无法储存的问题是什么。。研究一晚上了