跟我一起学Python数据处理(九十二):深入Scrapy爬虫的数据抓取技巧

一、学习初衷

大家好呀!在数据处理的学习道路上,每一次的探索都像是打开一扇新世界的大门。我希望通过这篇博客,能和大家一起深入学习Python数据处理中的Scrapy爬虫知识,让我们共同进步,掌握更多实用的技能,为数据处理打下坚实的基础。

二、定义数据模型

在Scrapy爬虫中,定义数据模型是很关键的一步。它就像是给爬虫制定了一个“收纳规则”,告诉爬虫抓到的数据该放在哪里。比如,我们想要抓取Python包的相关信息,就可以在items.py文件里定义一个数据模型类。

import scrapy


class NewPythonPackageItem(scrapy.Item):
    package_name = scrapy.Field()
    version = scrapy.Field()
    download_count = scrapy.Field()
    description = scrapy.Field()

这里定义了package_name(包名)、version(版本)、download_count(下载量)和description(描述)这几个字段,用来存储我们感兴趣的数据。在实际项目里,根据需求不同,定义的字段也会不一样。就像要收集不同的宝贝,得准备不同的盒子来装一样,每个字段就是一个“盒子”,对应一种数据类型。

三、使用Scrapy Shell探索页面元素

Scrapy Shell是个非常好用的工具,它能让我们在抓取数据之前,先在页面上“探探路”,看看怎么找到我们想要的数据。在使用它之前,要确保已经安装好了Scrapy和IPython(IPython能让我们的输入输出更美观,还提供了很多实用的工具)。

假设我们要抓取一个软件下载网站上某个软件的版本号和下载量。首先,在命令行输入scrapy shell启动Scrapy Shell,然后用fetch命令抓取页面内容,比如fetch('https://example.com/softwarename')

接下来,我们可以用XPath或者CSS选择器来定位元素。XPath就像是在网页这个“大地图”里按照路径找东西,CSS选择器则像是按照网页的“样式标签”来找。比如说,要找版本号,如果版本号在一个idversion-infodiv标签里,用XPath可以这样写:

response.xpath('//div[@id="version-info"]/text()')

这里的//表示在整个页面里找,div[@id="version-info"]就是找到idversion-infodiv/text()表示获取这个div里的文本内容。运行这段代码,就能得到版本号相关的信息啦。

要是用CSS选择器,假设版本号所在的div有个类名version-class,那就可以这样写:

response.css('.version-class::text')

这里的.表示按类名选择,::text表示获取这个元素里的文本。

有时候,定位元素可能没那么顺利。比如,要找下载量,它可能藏在一个结构比较复杂的地方,没有直接能用的id或者类名。这时候就得想点办法了。可以试试用XPath的一些特殊语法,像contains函数。如果下载量所在的span标签附近有个包含“下载量”三个字的li标签,就可以这样写:

response.xpath('//li[contains(text(), "下载量")]/span/text()')

contains(text(), "下载量")表示找文本里包含“下载量”这三个字的li标签,然后再通过/span/text()找到里面span标签的文本,也就是下载量。要是一开始没找对,别着急,多试试不同的选择器和语法,总能找到的。这就像是在迷宫里找出口,多试试不同的路,总能走出去。

四、编写完整的爬虫代码

有了前面的准备工作,就可以开始写一个完整的爬虫啦。假设我们要从一个书籍销售网站抓取书籍的名称、价格、作者和简介信息。

import scrapy
from new_book_spider.items import NewBookSpiderItem


class NewBookSpider(scrapy.Spider):
    name = 'new_book_spider'
    allowed_domains = ['bookstore.example.com']
    start_urls = ['https://bookstore.example.com/books']

    def parse(self, response):
        for book in response.css('.book-item'):
            item = NewBookSpiderItem()
            item['book_name'] = book.css('.book-title::text').get()
            item['price'] = book.css('.book-price::text').get()
            item['author'] = book.css('.book-author::text').get()
            item['description'] = book.css('.book-description::text').get()
            yield item

在这段代码里:

  • name是爬虫的名字,运行爬虫的时候会用到它。
  • allowed_domains规定了爬虫只能在这个域名下抓取数据,防止它跑到别的网站去。
  • start_urls是爬虫开始抓取的页面地址。
  • parse方法是处理页面响应的主要地方。通过response.css('.book-item')找到页面上每一本书的信息块,然后用CSS选择器分别获取书名、价格、作者和简介,把这些信息存到item里,最后用yielditem返回。这样,爬虫就能把抓取到的数据传递给后续的处理流程了。

五、总结与期望

通过这篇博客,我们学习了Scrapy爬虫中定义数据模型、使用Scrapy Shell探索页面元素以及编写完整爬虫代码的知识。希望大家能多动手实践,把这些知识运用到实际项目中。

写作不易,如果这篇博客对你有帮助,希望你能点赞、评论支持一下,也欢迎关注我的博客。后续我还会分享更多Python数据处理的内容,让我们一起在学习的道路上不断前进!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐