使用scrapy搭建大型爬蟲系統
最近新專案準備啟動,在開始前內容、詞庫這些都需要提前做好準備,所以就有了這篇文章。
在開始動手,看了下行業核心詞排在首頁的站,發現內容都多得不要不要的,各種亂七八糟的頻道、頁面模板,心想,如果每個網站、每套頁面都寫一套採集模板的話,那簡直要累死。
所以,這次,玩點不一樣的。
首先,根據需求,採集一個行業的文章內容,可以拆分為兩個模組:
- 爬蟲系統:主要負責在浩瀚的網際網路上,找到有內容價值的頁面並且把頁面抓取回來。涉及到URL去重、爬蟲策略深度、廣度一些雜事。
- 內容處理系統:主要負責處理爬蟲抓回來的內容,並從裡面提取出內容。
正文提取
以前在用印象筆記的時候,自帶的一些小外掛就很好用,只需要在瀏覽器上點一個按鈕,就會自動提取出當前網頁的正方,並且儲存到筆記庫裡面。
在網上找了下,發現已經有很多現成的解決方案了,而且解決的方案/演算法也很有意思。就是基於DOM樹來處理的。
凡是DOM節點 name 或ID帶有article、content、body的,加權重值。
DOM節點name或ID帶有foot、comment、menu……的,降權。
經過一輪遍歷後,把得分最高的節點提取出來,作為頁面正文所在的節點。
演算法參考:python-readability
測試了下,識別率還是挺高的,80%以上的成功率應該有。
抓取系統
爬蟲製作上面,選擇了一直以來,用的比較順手的scrapy做框架,程式碼如下:
# -- coding: utf-8 --
import scrapy
from scrapy import Request
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class LinkSpider(CrawlSpider):
name = 'link'
alloweddomains =
starturls =
rules = (
Rule(LinkExtractor(allow=r'\.htm', deny='baidu\.com'), callback='parseitem', follow=True),
)
def startrequests(self):
keywords = open('keywords.txt').readlines()
baseurlbaidu = 'https://www.baidu.com/s?rn=50&tn=baidulocal&wd=0&pn=1'
for kw in keywords:
# 構造百度搜尋結果頁URL
for pn in range(0,700,50):
yield Request(baseurlbaidu.format(kw,pn))
def parsestarturl(self, response):
"""從種子頁面提取URL作為初始連結"""
links = response.css('td.f a:first-childattr(href)').extract()
for link in links:
yield Request(url=link)
def parseitem(self, response):
"""提取符合要求的網站內頁"""
return response.url
程式碼有木有非常簡單(滑稽),種子頁面是從百度搜尋結果頁開始的,為了減少網路請求次數,把百度結果頁的網站數量從預設的10個,改成了50,同時使用了無廣告版的百度,URL是沒有經過加密的。
到這裡,基本上一個簡單的行業內容採集爬蟲就完成了,隨意測試了下scrapy的速度,發現在我的 I5機器上,每分鐘可以抓3356個頁面,這還只是單機單程式,鵝妹子嚶~~
參考資料:
如何實現有道雲筆記的網頁正文抓取功能?
相關文章
- python網路爬蟲(14)使用Scrapy搭建爬蟲框架Python爬蟲框架
- 爬蟲框架-scrapy的使用爬蟲框架
- Scrapy爬蟲框架的使用爬蟲框架
- Scrapy框架的使用之Scrapy通用爬蟲框架爬蟲
- scrapy爬蟲爬蟲
- 爬蟲--Scrapy簡易爬蟲爬蟲
- Scrapy爬蟲-草稿爬蟲
- Scrapy爬蟲框架爬蟲框架
- 爬蟲(9) - Scrapy框架(1) | Scrapy 非同步網路爬蟲框架爬蟲框架非同步
- Python3 大型網路爬蟲實戰 — 給 scrapy 爬蟲專案設定為防反爬Python爬蟲
- scrapy爬蟲代理池爬蟲
- 爬蟲實戰scrapy爬蟲
- Linux搭建Scrapy爬蟲整合開發環境Linux爬蟲開發環境
- Scrapy使用入門及爬蟲代理配置爬蟲
- python爬蟲之Scrapy 使用代理配置Python爬蟲
- Python Scrapy 爬蟲(二):scrapy 初試Python爬蟲
- scrapy之分散式爬蟲scrapy-redis分散式爬蟲Redis
- scrapy + mogoDB 網站爬蟲Go網站爬蟲
- python爬蟲Scrapy框架Python爬蟲框架
- 【Python篇】scrapy爬蟲Python爬蟲
- Python爬蟲—Scrapy框架Python爬蟲框架
- Scrapy建立爬蟲專案爬蟲
- Scrapy之"並行"爬蟲並行爬蟲
- Scrapy 示例 —— Web 爬蟲框架Web爬蟲框架
- 打造高效的分散式爬蟲系統:利用Scrapy框架實現分散式爬蟲框架
- Python下用Scrapy和MongoDB構建爬蟲系統(2)PythonMongoDB爬蟲
- Python下用Scrapy和MongoDB構建爬蟲系統(1)PythonMongoDB爬蟲
- 為什麼使用Scrapy框架來寫爬蟲?框架爬蟲
- 使用Scrapy構建一個網路爬蟲爬蟲
- Python爬蟲教程-33-scrapy shell 的使用Python爬蟲
- Python爬蟲 --- 2.3 Scrapy 框架的簡單使用Python爬蟲框架
- Scrapy爬蟲框架如何使用代理進行採集爬蟲框架
- Scrapy爬蟲 - 獲取知乎使用者資料爬蟲
- 爬蟲 Scrapy框架 爬取圖蟲圖片並下載爬蟲框架
- Python爬蟲教程-30-Scrapy 爬蟲框架介紹Python爬蟲框架
- 爬蟲(14) - Scrapy-Redis分散式爬蟲(1) | 詳解爬蟲Redis分散式
- 爬蟲學習之基於Scrapy的網路爬蟲爬蟲
- java 爬蟲大型教程(一)Java爬蟲