爬取某瓣妹子图片
需要源码私我
第一次写博客,刚接触scrapy(写的不好,多多见谅)
本人还是本着技术为主(fu),妹子为辅(zhu)的目的来学习的
爬虫的路上,一定不满足于使用requests+解析器来实现,这时候scrapy出现了,选择哪种还是得根据需求来,不必拘泥固定模式。scrapy对于小型任务来讲还是不错的,省去了自己码多线程,异步的时间,需要手写的也就解析跟管道处理两块。
话不多说,今天就使用scrapy完成一个简单的爬取某瓣的大熊妹子图吧
首先要确保电脑已经安装好了scrapy
创建项目:scrapy startproject Demo
创建spider:scrapy genspider douban2`` ‘www.xxx.cn’
目录结构
首先我们来编写item模块
这是我们想要采集的数据字段
我这里只提取了名称跟图片
import scrapy
class Douban2Item(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
image = scrapy.Field()
然后编写douban22.py 文件
这也是爬虫主要的实现逻辑
我是从第二页开始爬取的,第一页的URL有些变化
import scrapy
from douban2.items import Douban2Item
class Douban22Spider(scrapy.Spider):
name = 'douban22'
base_url = 'https://www.xxx(码).com/?cid=2&page='
pager_offset = 2
start_urls = [base_url + str(pager_offset)]
def parse(self, response):
node_list = response.xpath('//*[@id="main"]/div[2]/div[2]/ul')
for node in node_list:
item = Douban2Item()
for a in range(0,20):
item['name'] = node.xpath('.//img/@title').extract()[a]
item['image'] = node.xpath('.//img/@src').extract()[a]
yield item
if self.pager_offset < 300:
self.pager_offset += 1
url = self.base_url + str(self.pager_offset)
yield scrapy.Request(url, callback=self.parse)
接着我们编写pipelines.py
这是管道文件,采集到的数据通过yield信号,传到这里进行后续操作,可写入本地,也可写入数据库
class Douban2Pipeline(ImagesPipeline):
def get_media_requests(self,item,info):
image = item['image']
yield scrapy.Request(image)
def item_completed(self,results,item,info):
image_path = [x['path'] for ok, x in results if ok]
#os.rename(images_store+image_path[0],images_store+item['name']+'.jpg')
return item
最后打开settings.py
添加图片保存路径
IMAGES_STORE ='D:/爬虫/test1/Douban2/dbpic2/'
启用管道
ITEM_PIPELINES = {
'douban2.pipelines.Douban2Pipeline': 300,
}
运行 scrapy crawl douban22
好啦,到这儿某瓣的妹子图片就都到手啦