抓取【蜂鸟网】

0.获取的字段名

item.py # -*- coding: utf-8 -*- import scrapy class FengniaoItem(scrapy.Item): imgurl = scrapy.Field()

1.使用xpath 对其节点处理

feng.py # -*- coding: utf-8 -*- import scrapy from fengniao.items import FengniaoItem class FengSpider(scrapy.Spider): name = 'feng' allowed_domains = ['pp.fengniao.com'] start_urls = ['https://pp.fengniao.com/'] start = 1 # 如果遇到网页状态为404,500 handle_httpstatus_list = [404, 500] url = "https://pp.fengniao.com/album_1_" end = ".html" start_urls = [url + str(start) + end] def parse_item(self, response): if response.status in self.handle_httpstatus_list: if self.start <= 3009: self.start += 1 yield scrapy.Request(self.url+str(self.start)+self.end,callback = self.parse) else: i = FengniaoItem() for x in range(0,10): # imgs = response.xpath('//*[@id="contentBox"]/div['+str(x)+']/div[1]/img/@src').extract(); # if imgs != []: # print(imgs[0][:-42]) i['imgurl'] = response.xpath('//*[@id="contentBox"]/div['+str(x)+']/div[1]/img/@src').extract(); # print(i) yield i def parse(self, response): for i in range(1,40): links = response.xpath("//*[@id='contentBox']/ul/li["+str(i)+"]/a/@href").extract() for link in links: for j in range(0,5): link0 = link.replace('.html','_'+str(j)+'.html') yield scrapy.Request('https://pp.fengniao.com'+link0,callback = self.parse_item) if self.start <= 3009: self.start += 1 yield scrapy.Request(self.url + str(self.start) + self.end,callback = self.parse)

2.管道处理,对文件下载和存储json。

pipelines.py # -*- coding: utf-8 -*- import requests from fengniao import settings import os import codecs import json class FengniaoPipeline(object): def __init__(self): self.filename = codecs.open('feng.json',"w",encoding='utf-8') def process_item(self, item, spider): if 'imgurl' in item: images = [] dir_path = '%s/%s' % (settings.IMAGES_STORE, spider.name) if not os.path.exists(dir_path): os.makedirs(dir_path) for image_url0 in item['imgurl']: image_url = image_url0[:-42] us = image_url.split('/')[3:] image_file_name = '_'.join(us) file_path = '%s/%s' % (dir_path, image_file_name) images.append(file_path) if os.path.exists(file_path): continue with open(file_path, 'wb') as handle: response = requests.get(image_url, stream=True) for block in response.iter_content(1024): if not block: break handle.write(block) # print("start") # print(images) # print("end") item['imgurl'] = images content = json.dumps(dict(item),ensure_ascii=False) + "\n" self.filename.write(content) return item def spider_closed(self, spider): self.file.close()

3.设置路径,use-agent

settings.py # -*- coding: utf-8 -*- BOT_NAME = 'fengniao' SPIDER_MODULES = ['fengniao.spiders'] NEWSPIDER_MODULE = 'fengniao.spiders' IMAGES_STORE = './images' ROBOTSTXT_OBEY = True ITEM_PIPELINES = { 'fengniao.pipelines.FengniaoPipeline': 300, } DEFAULT_REQUEST_HEADERS = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3236.0 Safari/537.36', }

4.设置执行文件

main.py # -*- coding: utf-8 -*- from scrapy import cmdline cmdline.execute('scrapy crawl feng'.split())

5. python main.py结果如下图。预计可获取几百G。由于时间,硬盘空间原因,仅获取百G左右。所以,不再云空间放此类图片。云空间毕竟有限!

{"imgurl": ["./images/feng/201901_31_537b5a35e0a4e9964d676857127b89d4.jpg"]} {"imgurl": ["./images/feng/201901_31_46c6020cef412c5e86dbd050689452ba.jpg"]} {"imgurl": ["./images/feng/201901_31_2d88c6fd2836b5f64b25f469993017f6.jpg"]} {"imgurl": ["./images/feng/201901_31_ae3bc2699115ed2d614a647bf84d41e9.jpg"]} {"imgurl": ["./images/feng/201901_31_a1054d59a6bf99255c36aff4fc47f294.jpg"]}


6.github:https://github.com/itarvin-python/scrapy2.0/tree/master/feng1.0/fengniao


本文于 2020-01-11 17:33 由作者进行过修改

本文链接:https://itarvin.com/detail-21.aspx

登录或者注册以便发表评论

登录

注册