Scrapy爬虫实战:百度搜索找到自己 - Go语言中文社区

Scrapy爬虫实战:百度搜索找到自己


这里我们演示从百度找到我自己来让大家理解了解爬虫的魅力。

背景

有啥不懂的问度娘,百度搜索引擎可以搜到我们想要的内容,这里我们可以尝试爬取百度搜索引擎搜出来的东西,然后找到我们想要的内容。

例如:我们可以这样来搜索 https://www.baidu.com/s?wd=灵动的艺术
百度搜索

当然,因为我的博客是新开的,第一个自然不是我,并且能排名第一的必然也是要花钱的,大家懂的。

并且不但第一个不是我,可能第一页也可能都找不到我。我们需要不断过滤更多页才能找到我自己
更多页面

分析

怎么才算找到了自己

这里我演示找到我自己的博客就算是找到了我自己,判定方法有多种,比如找到了标题为【灵动的艺术的博客】新开始,新旅程 - CSDN博客就可以算是找到了我,或者百度连接为 http://www.baidu.com/link?url=9MdeR3DMon9bNvI8_loZk8MWb2s8zApEZx43oiOQgcsKAiSF3mvOD98YE811awwwm6NXYm8w7bVwfCF-a5VDerAiCmJyM1qFM9u5YrVraIO 这个,也算是找到了我自己。
这里我们以标题为例:

自己

怎么才能拿到百度搜索标题

如下图,我们利用浏览器的检查功能,利用选择工具,选中标题,我们就可以看到当前页面的内容
浏览器工具

这里我们可以知道我们的标题内容在'//div[@class="result c-container "]/h3/a'标签里面,那么我们需要获取这类标签的内容。

怎么爬取更多页面

同样的,如果我们希望爬取更多页面,我们需要拿到更页面的连接,并且继续访问它们。
同理:
页面标签

那么我们可以知道//div[@id="page"]/strong/span[@class="pc"]/text()标签可以拿到当前页。//div[@id="page"]/a/@href可以拿到更多页面的跳转连接。

baidu_search.py

这里我们修改之前的baidu_search.py

# -*- coding: utf-8 -*-
import scrapy
from tutorial.items import BaiDuSearchItem

class BaiduSearchSpider(scrapy.Spider):
    name = 'baidu_search'
    allowed_domains = ['www.baidu.com']
    start_urls = ['http://www.baidu.com/s?wd=灵动的艺术']

    def parse(self, response):
        # 拿到当前页码
        current_page = int(response.xpath('//div[@id="page"]/strong/span[@class="pc"]/text()').extract_first())

        #当前页面查找内容
        for i,a in enumerate(response.xpath('//div[@class="result c-container "]/h3/a')):
            #拿到标题文本
            title = ''.join(a.xpath('./em/text() | ./text()').extract())
            # 精确找到自己
            if title.find('灵动的艺术的博客') > -1:
                item = BaiDuSearchItem()
                item['visit_url'] = a.xpath('@href').extract()  # 提取链接
                item['page'] = current_page
                item['rank'] = i+1
                item['title'] = title
                yield item

        #依次访问百度下面的更多页面,再次分别查找
        for p in response.xpath('//div[@id="page"]/a'):
            p_url = 'http://www.baidu.com' + str(p.xpath('./@href').extract_first())
            yield scrapy.Request(p_url, callback=self.parse_other_page)

    def parse_other_page(self, response):
        #拿到当前页码
        current_page = int(response.xpath('//div[@id="page"]/strong/span[@class="pc"]/text()').extract_first())

        #当前页面查找内容
        for i,a in enumerate(response.xpath('//div[@class="result c-container "]/h3/a')):
            # 拿到标题文本
            title = ''.join(a.xpath('./em/text() | ./text()').extract())
            # 精确找到自己
            if title.find('灵动的艺术的博客') > -1:
                item = BaiDuSearchItem()
                item['visit_url'] = a.xpath('@href').extract()  # 提取链接
                item['page'] = current_page
                item['rank'] = i+1
                item['title'] = title
                yield item

代码比较简单,简单明了

声明BaiDuSearchItem

Items

爬取的主要目标就是从非结构性的数据源提取结构性数据,例如网页。 Scrapy spider可以以python的dict来返回提取的数据.虽然dict很方便,并且用起来也熟悉,但是其缺少结构性,容易打错字段的名字或者返回不一致的数据,尤其在具有多个spider的大项目中。。

为了定义常用的输出数据,Scrapy提供了 Item 类。 Item 对象是种简单的容器,保存了爬取到得数据。 其提供了 类似于词典(dictionary-like) 的API以及用于声明可用字段的简单语法。

许多Scrapy组件使用了Item提供的额外信息: exporter根据Item声明的字段来导出数据、 序列化可以通过Item字段的元数据(metadata)来定义、 trackref 追踪Item实例来帮助寻找内存泄露 (see 使用 trackref 调试内存泄露) 等等。

items.py

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class BaiDuSearchItem(scrapy.Item):
    visit_url = scrapy.Field()  # 链接
    page = scrapy.Field()  # 页码
    rank = scrapy.Field()  # 第几位
    title = scrapy.Field()  # 主标题

Item Pipeline

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。

每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。

以下是item pipeline的一些典型应用:

  • 清理HTML数据
  • 验证爬取的数据(检查item包含某些字段)
  • 查重(并丢弃)
  • 将爬取结果保存到数据库中

pipelines.py

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

class BaiDuSearchPipeline(object):
    def process_item(self, item, spider):
        print('BaiDuSearchPipeline',item)
        return item

配置Pipeline

我们需要在settings.py中配置Pipeline

settings.py

# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   'tutorial.pipelines.BaiDuSearchPipeline': 1,
}

运行测试

#进入虚拟环境
cd /data/code/python/venv/venv_Scrapy/
#crawl开始爬虫
../bin/python3 ../bin/scrapy crawl baidu_search

运行结果

结果表明,百度搜索出来的结果,我们在第2页第一个和第5页第八个都找到了我自己。

GitHub源码

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_43430036/article/details/84840614
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-08 11:31:22
  • 阅读 ( 2189 )
  • 分类:职场

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢