1. 程式人生 > >11月9日python分散式爬蟲

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()