scrapy实践之翻页爬取的实现

作者:生信修炼手册 时间:2023-09-25 23:09:26 

安装

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,
}

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

来源:https://blog.csdn.net/weixin_43569478/article/details/109542069

标签:scrapy,翻页,爬取
0
投稿

猜你喜欢

  • Python 实现list,tuple,str和dict之间的相互转换

    2021-02-28 12:35:42
  • 详解Python Socket网络编程

    2022-09-05 14:04:16
  • php以post形式发送xml的方法

    2023-11-22 12:40:47
  • SQL Server高级内容之子查询和表链接概述及使用

    2024-01-24 22:34:27
  • 解决django接口无法通过ip进行访问的问题

    2023-09-15 14:07:27
  • python如何实现excel数据添加到mongodb

    2023-05-05 17:23:18
  • Mysql数据库中的redo log 写入策略和binlog 写入策略

    2024-01-27 08:21:14
  • Go 语言中 20 个占位符的整理

    2024-04-23 09:45:21
  • python美多商城项目开发小结

    2022-09-05 08:01:48
  • JavaScript实现为input与textarea自定义hover,focus效果的方法

    2024-04-10 11:01:18
  • python一秒搭建FTP服务器

    2021-03-04 01:44:30
  • tensorflow之如何使用GPU而不是CPU问题

    2023-07-06 13:05:48
  • 利用Python实现在同一网络中的本地文件共享方法

    2023-10-31 00:41:58
  • Go语言resty http包调用jenkins api实例

    2024-05-21 10:27:27
  • Python使用minidom读写xml的方法

    2022-03-14 11:35:22
  • Python第三方常用模块openpyxl的简单介绍

    2021-05-28 16:10:09
  • div、section、article 的区别

    2011-02-26 15:39:00
  • 如何在页面错误时向数据库中添加记录?

    2010-06-26 12:26:00
  • python中break、continue 、exit() 、pass终止循环的区别详解

    2023-03-08 15:59:52
  • sql server 带列名导出至excel

    2008-11-25 11:07:00
  • asp之家 网络编程 m.aspxhome.com