##初学Scrapy爬虫
###1.前言
####以前用beautifulSoup,urllib2爬虫,想尝试一些框架来爬虫,所以就想学习一下Scrapy。因为对房价比较关心,正好国家统计局每个月都会发布70城市的住宅销售价格指数,所以就动了它的念头。
###2.思路与坑
####2.1 首先得了解一下Scrapy的框架。
如果还是不是很明白的话,可以看些 Examples。其实看例子更直接,不懂的再去查文档,这样比较高效,如果想深究,那又是一番景象了。
2.2 思路
- 2.2.1 首选找到首页url,然后递归的去处理每一页中的链接地址
- 2.2.2 其次就是需要匹配目标网页并解析网页【这是很重要的一步】
- 2.2.3 下面是核心的代码,按照瀑布模型去写的大致逻辑【虽然已过时,但好懂】
"""
爬取房价指数信息
"""
class ScrapeGovhousePriceSpider(scrapy.Spider):
name = "priceWave"
#这个start_urls 表示首先执行的url入口
start_urls = [
'http://www.stats.gov.cn/tjsj/zxfb/index_24.html',
]
#scrapy会调用start_requests返回response,然后调用parse方法
def parse(self, response):
lists = response.xpath('//a')
for quote in lists:
#处理response中的数据;getIndex方法就是提取item信息
yield scrapy.Request(href, callback = self.getIndex)
#下面的代码就是处理下一页的数据,scrapy.Request仍然会调用parse方法
next_page_url = response.xpath(u'//a[text()="下一页"]/@href').extract_first()
if next_page_url is not None:
yield scrapy.Request(response.urljoin(next_page_url))
"""
提取网页的数据用于返回item
"""
def getIndex(self, response):
#这里主要用正则表达式提取出item字段需要的值(在settings.py文件中设置字段)
item = HousewaveItem()
#提取逻辑---略
yield item
####2.3 坑
- 2.3.1 2014年以前的网页中的数据格式是不同的
- 2.3.2 直接在国家统计局中网站的搜索只能查到截止2016年的数据
- 2.3.3 为了解决2.3.2 中的问题,采用了关键字检索查询匹配的结果,但是检索得到的网页是带有js脚本的。
####2.4 解决方案
通过debug发现有几年的数据格式还是一致的,所以可以爬取到2014年的数据,暂时部分解决了2.3.1的问题 - 2.4.1 利用scrapy_splash渲染js
1:需要安装Docker,下载的时间还是很长的,费了不少时间安装。
2如果提示docker-machine.exe找不到,可能会在C:\Users\name.docker\machine\machines\default
3 如果提示VBoxManage.exe找不到,可以打开Docker Toolbox目录中的start.sh。需要注意的地方如下图中标识。
- 2.4.2 需要重写Spider的start_requests方法。读取 scrapy_splash渲染后的网页有两种方式,如下所示,但是要注意他们的区别
def start_requests(self):
for url in self.start_urls:
#直接利用SplashRequest也是ok的
# yield SplashRequest(url, self.parse, args={'wait':1}) #ok
yield scrapy.Request(url, meta={
'splash': {
'args': {
# set rendering arguments here
'html': 1,#返回的data是html,SplashTextResponse is returned when the result is text
'png': 1,
'wait':1, #等待时间防止ban
},
}
})
- 2.4.3 需要的拿走Docker安装文件–206M
- 2.4.4 致谢这位大神
###3额外收获 - 1 重定向日志输出
#log 配置
LOG_ENCODING='utf-8'
LOG_FILE='./logs'
LGO_STDOUT=False
- 2 Docker配置
#Docker配置
SPLASH_URL = 'http://192.168.99.100:8050'
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'