天天看点

用Python 的 Scrapy 爬取 网站用Python 的 Scrapy 爬取 网站

用Python 的 Scrapy 爬取 网站

说到制作蜘蛛爬取网站听起来挺简单的,其实深究起来是个蛮综合的应用,有不少技能点需要点亮。比如:

  • 基本的Request/Response
  • HTML,CSS,XPath,JavaScript等前端技能点

    即便你有这些技能点加成,不管你是Newbee还是老鸟,如果你坚持不懈的要制造自己的轮子,很多坑估计你死多少遍也填不平。这时候我适时的推荐你用Scrapy这个框架帮你实现你的小愿望。

这个例子假设你已经在很多其他的地方学会了如何创建一个Scrapy的项目了,打算活动一下筋骨,爬取一下链家北京的租房信息小试牛刀。

首先了解一下项目目录的结构:

  • items.py : 定义你要爬取的内容
  • middlewares.py : 定义一些中间组件,这些组件你可以想象成每次Request出去之前,Response回来之后安插在你的Spider之间的东西。这些组件会很有用。有的能帮你伪装成不同的浏览器,或者对特殊的响应代码做出不同的行为等等,总之这个时候你这里面什么都没有也是可以的。
  • pipelines.py : 想像一下每个抓取的items逐次流经你的大型流水线,线上的工人有的可以帮你打标签,有的可以帮你包装,有的可以帮你检查是否是残次品。
  • settings.py : 表里如一,人如其名
  • spiders : 蜘蛛目录,里面就是你的每个小蜘蛛了,这次我们假设只有一只
    • SpiderLianjia.py

然后我们观察一下网站内容:

用Python 的 Scrapy 爬取 网站用Python 的 Scrapy 爬取 网站

网站自上而下我用金色圈起来的分成四个部分,第1部分都是些条件选项等等,第2部分是列表显示的结果,第3部分是分页器,第4部分是网页的尾巴。整体的网站大都基本类似。我们主要关心的部分是2和3,所以其他部分我们就忽略不计了。

确定目标之后,你需要用XPath或者CSS等定位到包含2和3的HTML标签上,这一步我通常用Chrome的审查元素 帮我完成,快键CTRL+SHIFT+I 。我猜你也会有很多其他的办法做到这一步,这不关键。关键的是你能得到一个包含内容2和3的标签,比如XPath是这样的:

//div[@class="con-box"]

你点开2里面的每个房源信息的时候就会打开另外一个地址,我猜那里面才是你想抓取的内容,如法炮制,你需要把你关心的内容的标签路径搞到手,这里我就不贴二级页面的图了,而且假设我们只抓取房源详细信息的标题,那么就是这样:

//h1/text()

开始制作小蜘蛛吧

我们用Scrapy的CrawlSpider基类来制作我们的小蜘蛛。很简单

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class LianjiaZufangSpider(CrawlSpider):
    name = "lianjia.com" # 定义蜘蛛的名字
    allowed_domains = ['lianjia.com'] # 定义容许爬取的网站域,因为我们只想爬取链家,所以就他了
    start_urls = [
        'https://bj.lianjia.com/zufang/', # 告诉蜘蛛从哪里开始爬取
    ]
    rules = (
        # 这个地方告诉蜘蛛,网页这个标签里面的所有链接地址都是我们的爬取潜在目标,callback函数名称通知用什么函数来处理这种Request返回的结果
        # 注意restrict_xpaths是应用到每个页面的,理解这一段有助于你解开神秘的框架谜团
        Rule(LinkExtractor(restrict_xpaths='//div[@class="con-box"]'), callback='parse_item', follow=True),
    )

    # 这里就是处理二级页面(也就是租房的详细信息的地方)啦
    def parse_item(self, response):
        return  {
                'title' : response.xpath('//h1/text()').extract(),
                'content' : response.xpath('//h1/text()').extract()
        }
           

TA-DA~~运行时刻

然后就是见证奇迹的时刻了,启动蜘蛛:

scrapy crawl lianjia.com

你可以用Pipeline把爬取的信息打印到控制台上。

但是等一等

聪明如你肯定会有很多疑问,这蜘蛛怎么翻页的?

还记得

restrict_xpaths是应用到每个页面的

的那个注释么。页面标签中的每一个link都会发出一个Request,对于正常返回的Response都会再次调用restrict_xpaths里面的再次获取内部的link。层层递进,直到所有的都遍历一遍。咋样,不用递归,不用循环,是不是很爽啊,这就是框架的魅力啦。

很多链接都是重复的啊,咋办?

Again,框架的魅力再次星光闪闪,重复的链接框架直接过滤了,你不用操心啦。

最后

简单的,我们就爬取了一个网站。但是这个蜘蛛太lowbee了,像个没头没脑苍蝇一样的乱撞。我们在制作蜘蛛的时候肯定要会做得比这只体面一点啦。