Python爬虫入门-scrapy爬取唯一图库高清壁纸
2017-09-23 本文已影响243人
小小佐
首先,就是进入到唯一图库,点击上面的高清壁纸项目:
分析-00.png
进入之后,下拉,发现是正常的下拉没有Ajax加载,拉到最后面点击末页,可以看出这个栏目里面总共有292页:
分析-01.png
翻页看一下URL有什么变化,可以发现只有最后面代表这个页码的数字在发生变化:
分析-02.png
打开F12,刷新,在原始请求代码里面有能进入到进入详情页的链接地址,可以抓取下来:
分析-03.png
打开任意一张图片,进入到详情页码中,同样的F12,再刷新页面,里面有几个重要的信息我们要进行提取的,一个就是详情页的总页数,一个是标题,还有一个就是原图的下载地址,在原始请求的源代码中同样也能够找到相应的信息:
分析-04.png
分析-05.png
这里面还有分两种情况,一种就是总页数为一张的就不需要进行翻页,而对于总也是大于一张的图片就要再进行遍历,可以发现翻页时URL会发生变化:
http://www.mmonly.cc/gqbz/dmbz/xxxxx_i.html
经过分析以后就可以写代码了:
mmonly.py:
import scrapy
from scrapy.http import Request
from weiyiwang.items import WeiyiwangItem
class MmonlySpider(scrapy.Spider):
name = 'mmonly'
allowed_domains = ['mmonly.cc']
start_urls = ['http://www.mmonly.cc/gqbz/list_41_{}.html'.format(i) for i in range(1,293)]
def parse(self, response):
links=response.css('.item.masonry_brick.masonry-brick')
for link in links:
detail_url = link.css('.ABox a::attr(href)').extract_first()
pages=link.css('.items_likes::text').re_first('共(.*)张')
if pages==1:
url=detail_url
yield Request(url=url, callback=self.parse_detail)
else:
for i in range(1,int(pages)):
url=detail_url.split('.html')[0]+'_{}.html'.format(i)
yield Request(url=url,callback=self.parse_detail)
def parse_detail(self,response):
item=WeiyiwangItem()
item['title']=response.css('.wrapper.clearfix.imgtitle h1::text').extract_first()
item['img_url']=response.css('.big-pic a img::attr(src)').extract_first()
yield item
最后的结果是存储至Mongodb:
pipeline.py:
import pymongo
class MongoPipeline(object):
def __init__(self,mongo_uri,mongo_db):
self.mongo_uri=mongo_uri
self.mongo_db=mongo_db
@classmethod
def from_crawler(cls,crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DB')
)
def open_spider(self,spider):
self.client=pymongo.MongoClient(self.mongo_uri)
self.db=self.client[self.mongo_db]
def close_spider(self,spider):
self.client.close()
def process_item(self, item, spider):
self.db['weiyi'].insert(dict(item))
return item
分析-06.png