路飛學城-爬蟲集訓營-第三章

學習心得:html

  人生苦短,我用python,爬蟲深海,我選scrapy。!!python

  在學習scrapy的時候真的很累,不少時候看着都會困,由於基礎不牢固,看着會感受有點累。。遇到問題一點點的查資料才能填補上,反覆的看wusir的視頻來學習。每次看都會學到新的東西就比如每次看python核心編程都能學到更多,補充本身不牢固,不知道的知識,總的來講學習無捷徑,只能經過本身認真的努力才能學到更多。別人幫你的始終都是有限的linux

 

爬蟲框架 ---scrapyredis

  什麼是scrapy?   編程

     Scrapy是一個爲了爬取網站數據,提取結構性數據而編寫的應用框架。 能夠應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。windows

     其最初是爲了 頁面抓取 (更確切來講, 網絡抓取 )所設計的, 也能夠應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。api

  scrapy的執行流程網絡

  

    Scrapy主要包括瞭如下組件:框架

    • 引擎(Scrapy)
      用來處理整個系統的數據流處理, 觸發事務(框架核心)
    • 調度器(Scheduler)
      用來接受引擎發過來的請求, 壓入隊列中, 並在引擎再次請求的時候返回. 能夠想像成一個URL(抓取網頁的網址或者說是連接)的優先隊列, 由它來決定下一個要抓取的網址是什麼, 同時去除重複的網址
    • 下載器(Downloader)
      用於下載網頁內容, 並將網頁內容返回給蜘蛛(Scrapy下載器是創建在twisted這個高效的異步模型上的)
    • 爬蟲(Spiders)
      爬蟲是主要幹活的, 用於從特定的網頁中提取本身須要的信息, 即所謂的實體(Item)。用戶也能夠從中提取出連接,讓Scrapy繼續抓取下一個頁面
    • 項目管道(Pipeline)
      負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證明體的有效性、清除不須要的信息。當頁面被爬蟲解析後,將被髮送到項目管道,並通過幾個特定的次序處理數據。
    • 下載器中間件(Downloader Middlewares)
      位於Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
    • 爬蟲中間件(Spider Middlewares)
      介於Scrapy引擎和爬蟲之間的框架,主要工做是處理蜘蛛的響應輸入和請求輸出。
    • 調度中間件(Scheduler Middewares)
      介於Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的請求和響應。

  流程異步

    從調度列表中取出一個URL,抓取而且分析
    把url封裝成請求傳給下載器
    下載器把資源下載下來,封裝成response
    爬蟲解析response
    解析數據(item)而後交給管道進行持久化處理

  scrapy的項目結構:

    items.py 負責數據模型的創建,相似於實體類。
    middlewares.py 本身定義的中間件。
    pipelines.py 負責對spider返回數據的處理。
    settings.py 負責對整個爬蟲的配置。
    spiders目錄 負責存放繼承自scrapy的爬蟲類。
    scrapy.cfg scrapy基礎配置


Scrapy簡單使用
1.安裝

linux:
pip/pip3 install scrapy
windows:
pip install pywin32
pip install wheel
pip install twisted.whl #windows不能直接安裝須要下載whl文件
pip install scrapy

2.建立項目

scrapy project project_name #建立項目
cd project_name
scrapy genspider 爬蟲名字 爬蟲網站 #建立spider
scrapy crawl 爬蟲名字 #運行 --nolog 不帶日誌

 

3.解析網頁

Scrapy提取數據有本身的一套機制。它們被稱做選擇器(seletors),由於他們經過特定的 XPath 或者 CSS 表達式來「選擇」 HTML文件中的某個部分。

XPath 是一門用來在XML文件中選擇節點的語言,也能夠用在HTML上。 CSS 是一門將HTML文檔樣式化的語言。選擇器由它定義,並與特定的HTML元素的樣式相關連。

Scrapy選擇器構建於 lxml 庫之上,這意味着它們在速度和解析準確性上很是類似。

response.xpath('//div[@id="content-list"]/div[@class="item"]')

具體選擇器使用 :http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/selectors.html#topics-selectors-ref

4.pipelines

from scrapy.exceptions import DropItem

class Pipeline(object):

  def __init__(self,path):
    self.f = None
    self.path
= path   @classmethod   def from_crawler(cls, crawler):     print('File.from_crawler')     path = crawler.settings.get('HREF_FILE_PATH')     return cls(path)
  
def open_spider(self,spider):     print('File.open_spider')     self.f = open(self.path,'a+')   def process_item(self, item, spider):     print('File',item['href'])     self.f.write(item['href']+'\n')     raise DropItem()# 後續的 pipeline的process_item方法再也不執行   def close_spider(self,spider):     print('File.close_spider')     self.f.close()

調用pipelines須要在settings文件裏找到ITEM_PIPELINES取消註釋~

 

5.去重規則 

1.將訪問過的url標識保存到內存(redis)中

2.若是訪問過則返回True,不然訪問並把標識加入列表中

3.編寫類

from scrapy.dupefilter import BaseDupeFilter
from scrapy.utils.request import request_fingerprint class DupeFilter(BaseDupeFilter): def __init__(self):   self.visited_fd = set() @classmethod def from_settings(cls, settings): return cls() def request_seen(self, request): fd = request_fingerprint(request=request) if fd in self.visited_fd: return True self.visited_fd.add(fd) def open(self): # can return deferred print('開始') def close(self, reason): # can return a deferred print('結束')

4.在配置文件替換默認去重記錄

# 修改默認的去重規則
# DUPEFILTER_CLASS = 'scrapy.dupefilter.RFPDupeFilter'
DUPEFILTER_CLASS = 'xdb.dupefilters.XdbDupeFilter'
相關文章
相關標籤/搜索