scrapy实践之翻页爬取的实现

 更新时间:2021年01月05日 09:38:04   作者:生信修炼手册  
这篇文章主要介绍了scrapy实践之翻页爬取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

安装

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脚本实现传递参数的三种方式分享

    使用python脚本传递参数在实际工作过程中还是比较常用。这篇文章为大家总结了三个常用的方式,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-12-12
  • 20招让你的Python飞起来!

    20招让你的Python飞起来!

    20招让你的 Python飞起来!这篇文章主要为大家详细介绍了Python性能优化的20条建议,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 详解Python如何生成词云的方法

    详解Python如何生成词云的方法

    这篇文章主要介绍了详解Python如何生成词云的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • python实现屏保程序(适用于背单词)

    python实现屏保程序(适用于背单词)

    这篇文章主要为大家详细介绍了python实现屏保程序,适用于背单词,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Python基础之数据类型相关知识总结

    Python基础之数据类型相关知识总结

    众所周知,在Python中,常用的数据类型有三种,分别是字符串、整数和浮点数.在Python基础学习的过程中,数据类型是初学者常常容易混淆的一个基础知识点,本文为大家详细总结了三种数据类型的概念、数据类型的查询以及更为复杂的数据转化,需要的朋友可以参考下
    2021-06-06
  • Pycharm如何返回上一次编辑处的快捷键

    Pycharm如何返回上一次编辑处的快捷键

    这篇文章主要介绍了Pycharm如何返回上一次编辑处的快捷键问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Python深拷贝与浅拷贝用法实例分析

    Python深拷贝与浅拷贝用法实例分析

    这篇文章主要介绍了Python深拷贝与浅拷贝用法,结合实例形式分析了Python对象的复制、深拷贝、浅拷贝等操作原理、用法及相关注意事项,需要的朋友可以参考下
    2019-05-05
  • Python随机验证码生成和join 字符串的问题解析

    Python随机验证码生成和join 字符串的问题解析

    Python中有join()和os.path.join()两个函数,join是将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串而os.path.join(): 将多个路径组合后返回,本文给大家介绍的非常详细,需要的朋友一起看看吧
    2022-04-04
  • 浅谈python 中类属性共享的问题

    浅谈python 中类属性共享的问题

    今天小编就为大家分享一篇浅谈python 中类属性共享的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • python入门之井字棋小游戏

    python入门之井字棋小游戏

    这篇文章主要为大家详细介绍了python入门学习之井字棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03

最新评论