1. 程式人生 > 程式設計 >scrapy實踐之翻頁爬取的實現

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 翻頁爬取內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!