scrapy实践之翻页爬取的实现


Posted in Python onJanuary 05, 2021

安装

Scrapy的安装很简单,官方文档也有详细的说明 http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/install.html 。这里不详细说明了。

在scrapy框架中,spider具有以下几个功能

1. 定义初始爬取的url

2. 定义爬取的行为,是否跟进链接

3. 从网页中提取结构化数据

所谓的跟进链接,其实就是自动爬取该页的所有链接,然后顺着对应的链接延伸开来不断爬取,这样只需要提供一个网站首页,理论上就可以实现网站全部页面的爬取,实现点到面的功能。

如果自己来开发,不仅需要在算法层面,考虑是使用深度优先还是广度优先,还需要处理好提取的url的限制条件等细节工作。在scrapy中,开发过程被大大简化了,我们只需要定义以下几个关键部分的代码,就可以实现翻页效果。

1. Spider

核心思想是在parse方法中,返回新的Requests请求,代码如下

import scrapy
 
from hello_world.items import HelloWorldItem
 
class MirSpider(scrapy.Spider):
  name = "MirSpider"
  start_urls = ["http://mirtarbase.cuhk.edu.cn/php/search.php?opt=species&org=bta&sort=id&order=asc&page=1"]
 
  def parse(self, response):
    domain = 'http://mirtarbase.cuhk.edu.cn'
    for row in response.xpath('//table/tr'):
      item = HelloWorldItem()
      res = []
      for col in (row.xpath('td/text()')):
        res.append(col.extract())
      if res[0] != 'Bos taurus':
        continue
      item['species'] = res[0]
      item['miRNA'] = res[2]
      item['target'] = res[3]
      item['total'] = res[4]
      item['papers'] = res[5]
      yield item
    for url in response.xpath('//a/@href').extract():
      if 'page' in url:
        url = domain + url
        yield scrapy.Request(url, callback = self.parse, dont_filter = False)

关键代码是最后几行的for循环,在start_urls中,我们只提供了一个初识的url, 在parse方法中,除了常规的返回结构性数据item外,我们还返回了新的requests请求,首先提取页面上所有的url, 并对url的链接进行了限制,对需要爬取的url链接以Request的方法进行返回,注意dont_filter的设置,当设置为False时,会调用scrapy默认的url去重机制,这样不会重复下载。

2. Item Pipeline

对于下载的item, 有些会出现重复的现象,此时可以在pipelines.py中,对item进行操作,实现item去重的代码如下

from itemadapter import ItemAdapter
 
 
class HelloWorldPipeline:
  def __init__(self):
    self.link_set = set()
 
  def process_item(self, item, spider):
    link = item['miRNA'] + item['target']
    if link in self.link_set:
      raise DropItem(item)
    self.link_set.add(link) 
    return item

在process_item方法中,通过一个set对象来达到去重的效果。需要注意,默认pipelines是没有开启的,编写完代码之后,需要在settings.py中进行配置,开启对应的pipeline, 内容如下

ITEM_PIPELINES = {
  'hello_world.pipelines.HelloWorldPipeline': 300,
}

对于标准的多页表格数据,采用上述的代码可以轻松实现翻页效果,非常的方便。

到此这篇关于scrapy实践之翻页爬取的实现的文章就介绍到这了,更多相关scrapy 翻页爬取内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
Python实现小数转化为百分数的格式化输出方法示例
Sep 20 Python
django 按时间范围查询数据库实例代码
Feb 11 Python
用Python3创建httpServer的简单方法
Jun 04 Python
python基础学习之如何对元组各个元素进行命名详解
Jul 12 Python
PyQt QCombobox设置行高的方法
Jun 20 Python
python+selenium select下拉选择框定位处理方法
Aug 24 Python
使用Python为中秋节绘制一块美味的月饼
Sep 11 Python
python pycharm最新版本激活码(永久有效)附python安装教程
Sep 18 Python
Python是怎样处理json模块的
Jul 16 Python
python3美化表格数据输出结果的实现代码
Apr 14 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 Python
python里glob模块知识点总结
Jan 05 #Python
python用opencv 图像傅里叶变换
Jan 04 #Python
python基于opencv 实现图像时钟
Jan 04 #Python
python基于opencv实现人脸识别
Jan 04 #Python
利用python绘制正态分布曲线
Jan 04 #Python
Python 打印自己设计的字体的实例讲解
Jan 04 #Python
Python关于拓扑排序知识点讲解
Jan 04 #Python
You might like
Codeigniter检测表单post数据的方法
2015/03/21 PHP
用php+ajax新建流程(请假、进货、出货等)
2017/06/11 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
2015/12/03 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
jquery实现点击页面回到顶部
2016/11/23 Javascript
老生常谈javascript中逻辑运算符&&和||的返回值问题
2017/04/13 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
webpack4的迁移的使用方法
2018/05/25 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
win10系统中安装scrapy-1.1
2016/07/03 Python
Python 打印中文字符的三种方法
2018/08/14 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
用python写一个定时提醒程序的实现代码
2019/07/22 Python
使用 python pyautogui实现鼠标键盘控制功能
2019/08/04 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
Python字典取键、值对的方法步骤
2020/09/30 Python
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
机械专业求职信
2014/05/25 职场文书
趣味运动会加油词
2015/07/18 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
浅谈python中的多态
2021/06/15 Python
JavaScript组合继承详解
2021/11/07 Javascript
python 详解turtle画爱心代码
2022/02/15 Python