11月9日python分佈式爬蟲

實例方法, 靜態方法, 類方法的區別
實例方法: 類中定義的普通方法,只能通過實例對象調用
靜態方法: 靜態方法主要是用來存放邏輯性的代碼,邏輯上類型屬於這個類,但是和類本身沒有關係,實例對象和類對象都可以
調用
類方法的區別:假設有個方法,且這個方法在邏輯上採用類本身作爲對象來調用更合理,那麼這個方法就可以定義爲類方法。另外,如果需要繼承,也可以定義爲類方法,實例對象和類對象都可以調用

使用分佈式必須要安裝: pip install scrapy-redis


分佈式:
分佈式爬蟲的難點在於多臺機器之間怎麼互相通信而防止爬取重複的url,解決辦法就是使用內存型數據庫redis,
在redis中創建一個列表,列表用於記錄爬取過的url, 每臺機器在爬取之前都訪問該數據庫,看將要爬取的url是否在redis
數據庫中,如果在的話就不再進行爬取。


生成爬蟲可以不加模板,不加模板的話就不會出現rules,需要自己寫
起始url不寫在項目中,寫在redis數據庫中
索引頁要follow,國家內容不follow,但是有callback
from scrapy_redis.spiders import RedisCrawlSpider
引入需要的模塊,爬蟲模塊繼承的類需要改成RedisCrawlSpider

如果出現填一個url才能爬取一個url,不能自動爬取的話首先看一下域名是否正確,如果實在不行的話就把redis數據庫
清空一下(flushdb),可能是由於存儲爬取過的url那個列表的上次運行緩存太多造成的

使用分佈式需要使用redis數據庫,在終端連接redis數據庫的命令是 redis-cli

需要在redis數據庫中插入第一個url:
lpush start_urls http://example.webscraping.com/places/default/index/1

如果報錯:
TypeError: 'ItemMeta' object does not support item assignment
說明爬蟲模塊引入的Item模塊中定義的類的名字不對,或者是引用過來少帶了括號。

打開文件最常用的有兩種方式:
1. 文本文件不需要用wb, 可以直接存儲,如果加了wb, 下面寫入的過程還需要encode('utf8'),圖片,音頻視頻存爲不同類型的文件時一定要加wb, 不同類型的文件後綴名不一樣,可以採用字符串拼接的方式直接將爬出數據的名字定義爲文件名,如:
(file = item['aname'] + '.txt'), (pic = item['aname'] + '.jpg')
1.第一種存儲過程
f = open(file, 'w')
f.write((item['aname']+','+item['atype'] + '\n'))
f.close()

with open的方式打開不用關係關閉因爲with open用完會自動關閉:
2.第二種存儲過程
with open(file,'w',encoding='utf8') as f:
    f.write((item['aname']+','+item['atype'] + '\n'))
    f.close()
    
scrapy存儲圖片:
 with open(pic, 'wb') as p:
            p.write(requests.get(item['aimage']).content)
            p.close()

            
同時可以指定打開某個路徑下的文件或者保存到某個路徑下,如果不指定的話默認就是相對路徑的當前的目錄下:
如果使用/來表示路徑可以直接寫絕對路徑,如果使用\則需要在絕對路徑的前面加r來表示不轉義,以原字符解釋, 路徑的
最後一定要加/表示最後那個文件下:
with open('G:/第四階段/11月9日AnimalSpider/Animal/data/'+file,'w',encoding='utf8') as f:
    f.write((item['aname']+','+item['atype'] + '\n'))
    f.close()

with open(r'G:\第四階段\11月9日AnimalSpider\Animal\data/'+file,'w',encoding='utf8') as f:
    f.write((item['aname']+','+item['atype'] + '\n'))
    f.close()
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章