學習心得:html
人生苦短,我用python,爬蟲深海,我選scrapy。!!python
在學習scrapy的時候真的很累,不少時候看着都會困,由於基礎不牢固,看着會感受有點累。。遇到問題一點點的查資料才能填補上,反覆的看wusir的視頻來學習。每次看都會學到新的東西就比如每次看python核心編程都能學到更多,補充本身不牢固,不知道的知識,總的來講學習無捷徑,只能經過本身認真的努力才能學到更多。別人幫你的始終都是有限的linux
爬蟲框架 ---scrapyredis
什麼是scrapy? 編程
Scrapy是一個爲了爬取網站數據,提取結構性數據而編寫的應用框架。 能夠應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。windows
其最初是爲了 頁面抓取 (更確切來講, 網絡抓取 )所設計的, 也能夠應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。api
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'