scrapy-redis下載及專案講解
阿新 • • 發佈:2019-02-06
首先,如果沒有下載git,執行後續命令時,可能會報錯。
安裝很簡單,一直進行下一步即可(個別選項依照個人需求更改)
空白處滑鼠右擊,點選 Git Bash Here 出現視窗,輸入命令:git --version 即可檢視當前下載的git版本(效果如下)
接下來就來下載 scrapy-redis專案
在桌面新建資料夾(名字自定義),然後開啟cmd終端,cd到剛才新建的資料夾路徑,輸入命令:git clone + 複製專案的下載路徑,回車執行完畢後,專案就下載好了,檔案中顯示內容大致如下:
將資料夾拖入到PyChrom中,點選example下,進入到settings 裡面,確保下方程式碼處於解註釋狀態
# 使用scrapy_redis的去重類 不使用scrapy預設的去重類 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 使用scrapy_redis的排程器,不使用scrapy預設的排程器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 控制爬蟲是否允許暫停 SCHEDULER_PERSIST = True ITEM_PIPELINES = { 'example.pipelines.ExamplePipeline': 300, # 使用redis資料庫所要新增的管道,如果使用redis資料庫 必須新增 'scrapy_redis.pipelines.RedisPipeline': 400,、 #這兩句程式碼可寫可不寫,如若不寫,預設為本機ip REDIS_HOST = '127.0.0.1' # redis資料庫的ip # 埠為數字 REDIS_PORT = 6379
接下來就自帶的三個爬蟲小程式進行實操講解:
(1)dmoz專案(此處為單機爬蟲)
由於 dmoz.com已經於去年停止使用,所以這裡就改爬紅袖小說的小說名字......
from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule class DmozSpider(CrawlSpider): """Follow categories and extract links.""" name = 'dmoz' allowed_domains = ['hongxiu.com'] start_urls = ['https://www.hongxiu.com/finish'] # 規則 rules = [ # 獲取網頁的指定內容 然後進入到指定方法裡面 Rule(LinkExtractor( restrict_css=('.book-info') # follow 設定是否繼續執行後面的內容 # 如果有回撥函式,則預設為False 否則為True ), callback='parse_directory', follow=True), ] def parse_directory(self, response): # for div in response.css('.title-and-desc'): # yield { # 'name': div.css('.site-title::text').extract_first(), # 'description': div.css('.site-descr::text').extract_first().strip(), # 'link': div.css('a::attr(href)').extract_first(), # } print('----------------') print(response.url)
在執行命令之前,先在終端開啟redis資料庫(命令:redis-server redis.windows.conf),之後再開啟一個cmd終端視窗,cd到當前需執行的資料夾路徑下,然後輸入命令:scrapy crawl dmoz 即可。
(2.)mycrawler_redis專案(分散式爬蟲)
注意:網頁連結依然引用紅袖連結
from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor
from scrapy_redis.spiders import RedisCrawlSpider
class MyCrawler(RedisCrawlSpider):
"""Spider that reads urls from redis queue (myspider:start_urls)."""
name = 'mycrawler_redis'
# allowde_domains = ['biadu.com']
redis_key = 'mycrawler:start_urls' # 類名 : start_urls 推薦寫法;標準寫法
# start_urls = ['']
rules = (
# follow all links
Rule(LinkExtractor(), callback='parse_page', follow=True),
# Rule(LinkExtractor(), callback='detali')
)
# 初始化方法
# def __init__(self, *args, **kwargs):
# # 動態的 定義 allowde允許 domains域名 list列表
# # Dynamically define the allowed domains list.
# # 此處動態定義域名列表
# domain = kwargs.pop('domain', '')
# # self.allowed_domains = filter(None, domain.split(','))
# # super 後面寫自己的類名
# super(MyCrawler, self).__init__(*args, **kwargs)
def parse_page(self, response):
# return {
# 'name': response.css('title::text').extract_first(),
# 'url': response.url,
# }
print('============================')
print(response.url)
開啟cmd終端,輸入命令:scrapy crawl mycrawler_redis ,執行後,會到下圖位置停止:
這裡先不要關閉或者停止執行,另外開啟一個cmd終端,輸入命令:redis-cli,效果如下:
接著再次輸入命令:lpush key值(redis-key值) value值(爬取的網頁連結) 回車,上一個終端命令即可繼續執行(因為在等待請求網頁連結)
開啟redis資料庫資料庫檢視:
第三個小專案跟第二個專案類似,這裡就跳過了。