热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

Scrapy爬虫实战:百度搜索找到自己,Go语言社区,Golang程序员人脉社

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

  • 背景
  • 分析
    • 怎么才算找到了自己
    • 怎么才能拿到百度搜索标题
    • 怎么爬取更多页面
  • baidu_search.py
  • 声明BaiDuSearchItem
    • Items
    • items.py
  • Item Pipeline
    • pipelines.py
  • 配置Pipeline
    • settings.py
  • 运行测试

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


背景

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

例如:我们可以这样来搜索 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源码




推荐阅读
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
author-avatar
美甲控Alily
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有