初学Scrapy爬虫

##初学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'

###完整github代码 (toy)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值