python使用scrapy爬表格,爬虫中级

上一篇讲道了爬虫入门,这一篇介绍怎么使用爬虫框架来爬数据。框架用的是scrapy https://doc.scrapy.org/en/latest/。在开始动手之前,还是建议大家用pyenv和virtualenv隔离一下环境。当然如果觉得麻烦的话可以略过。

先把环境切到3.5.3,然后再切换包环境。我系统是没有安装scrapy的,所以要进行下面这两步。安装了scrapy的忽略它。看不明白我在说什么的也可以忽略它。
pyenv local 3.5.3 pyenv activate venv353

万事俱备了,可以开始了。写爬虫入门了以后,最困难的应该是调试。在这个阶段,需要学习http协议,要学习html,要学习CSS,还要学会各种字符编码知识,相信我,不会各种编码的话,迟早会一头栽进坑里好几天爬不上来,学习曲线一下变得很陡峭。还要会处理各种异常,至于框架本身的学习,倒不是太难的事情了。因为网上一搜一大把入门的博客,跟着做总能成功的。说了这么多,无非是在讲写爬虫要进阶需要的知识面。如果都不具备,那还是先看看这方面的书吧。

为了方便码农入门和调试,scrapy提供了一个叫shell的强大模式。用起来也很简单:
scrapy shell url
scrapy会自动打开url,并且将返回放在一个叫response的对象里,在scrapy shell中可以直接访问。在shell中可以直接对它进行操作,方便码农调试各种正则表达式,还有DOM操作的表达式。

《python使用scrapy爬表格,爬虫中级》 scrapy_shell_step1.png

这里访问的是一个药材网站,上面有价格[同理可以把它换成某电商,某商城]。按惯例先上流星器开发者工具,上去检测一下。以找到想要的内容。探测到价格是在一个div里面,价格条目都是li元素。

定位到了要取的东西以后,下面是决定用什么方式来获取元素。如果只想取关键字,就推荐使用正则表达式;如果只取某一类,就推荐用css选择器;如果要取结构化的内容,就用xpath。因为要取表格,这里使用xpath。

《python使用scrapy爬表格,爬虫中级》 scrapy_shell_step2.png

到这scrapy的shell模式就介绍完成了,scrapy这个功能还是非常方便的。下面介绍一下怎么用scrapy建一个项目试试。

scrapy startproject spider

《python使用scrapy爬表格,爬虫中级》 scrapy_project_s1.png

项目建好后会生成一个spider的目录,作为初学者,可以忽略items.py,还有pipeline.py。在spiders目录建一个文件,命名可自己来定,这里叫ZycSpider,这个类必须子scrapy.Spider的子类。类成员name必须唯一。parse方法必须要有的,要不然抓了不处理就没意义了不是。

#coding:utf-8

import scrapy
from spider.items import PriceItem

class ZycSpider(scrapy.Spider):
    name = "zyc"

    def start_requests(self):
        urls = ['http://www.zyctd.com/jiage/1-0-0.html']

        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)
            pass
        pass

    #version1
    def parse(self, response):
        page = response.url.split('/')[-2]
        filename = '%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
            pass
        self.log('Saved file %s' % filename)

    #version2
    def parse(self, response):
        price_tbl = response.xpath("//ul[@class='priceTableRows']")
        price_list = price_tbl.xpath("li")
        for i in price_list:
            price_detail = i.xpath("span//text()")
            [name,quality,from_where,price,future_move,week_up,month_up,year_up] = price_detail.extract()
            yield {
                'name':name,
                'quality':quality,
                'from_where':from_where,
                'price':price,
                'future_move':future_move,
                'week_up':week_up,
                'month_up':month_up,
                'year_up':year_up
            }
            pass
        pass

其中version1是把文件直接存下来,version2是解析后,吐出json。

代码写好以后,
cd spider crapy crawl zyc
结果就出来了。下一步就是完善这个代码,加上items.py,加上pipelines.py的功能。再加上页面内连接抓取。

    原文作者:天一阁图书管理员
    原文地址: https://www.jianshu.com/p/98cfd4570496
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞