Python爬蟲【四】Scrapy+Cookies池抓取新浪微博

1.設置ROBOTSTXT_OBEY,由true變爲false
2.設置DEFAULT_REQUEST_HEADERS,將其改成request headers
3.根據請求連接,發出第一個請求,設置一個start_request方法,並在方法中定義相關的配置,好比在本例中設置搜索的關鍵字keyword
4.接下來定義一個連接,也就是start_url,本例中改成search_url,其中把base_url定義爲該類的全局變量,後面的參數用於翻頁設置等
5.根據網頁源碼中的Form Data,定義一些其餘的要求,好比本例中的最大頁碼數
6.在start_requests方法中,構造請求url的可變參數部分,search_url和keyword部分,用formate()傳入
7.由於最大頁數爲100,接下來須要構造100個請求,利用for循環,page從1-100進行遍歷
8.在for循環中把Form Data傳過去,mp就是max_page,把mp和page都轉換成字符串的形式
9.生成post請求,這裏用FormRequest來構造,第一個參數就是構造的url,回調函數是網頁解析方法parse_index函數,formdata直接賦值爲data
10.藉助cookie池,從中隨機取出一個cookie賦值給request,因此接下來在middleware裏面定義一箇中間件,定義一個CookiesMiddleware類
11.在類中改寫請求,定義一個process_request方法,在對request進行改寫,先要拿到cookies
12.在類中定義一個方法_get_random_cookies用來隨機獲取一個cookies
13.在_get_random_cookies方法中,用request庫的get請求,傳入url,這個url是cookie池的微博random的url,請求一次便可獲取一個cookies值,http://127.0.0.1/weibo/random
14.而後判斷response的返回狀態碼==200則成功,而後就把網頁內容用json解析,
15.獲取cookie只需在process_request中調用_get_random_cookies方法,若是獲取到了cookie,就把request.cookies正常改寫。
16.在process_request中用logger,而後用json的dumps輸出成字符串
17.把cookie池的微博random的url配置成可變參數,實現結構化,首先在CookiesMiddleware中定義一個類方法from_crawler,實現把配置的url配置到全局的settings裏面
18.利用from_crawler中的crawler對象獲取settings裏面的相關信息crawler.settings.get('COOKIES_POOL_URL'),而後在settings裏面設置COOKIES_POOL_URL = 'http://127.0.0.1/weibo/random'
19.接下來在__init__方法中接收cookies_pool_url,並把它設置爲一個全局的變量,request的get方法也能夠用全局的cookies_pool_url代替
20.改寫以前cookies的開關,改寫settings中的DOWNLOADER_MIDDLEWARES,改爲咱們設置的名字
21.改寫parse_index方法,進行網頁索引,首先抓取每篇微博,微博最外面的條目能夠用id來識別,用contains,第一個參數傳入id,第二個參數傳入id的值,也就是‘M_’,就能夠判斷class=c,而且id是以M_開頭的
22.抓取下來的列表是個列表,而後對其進行遍歷
23.在遍歷裏面要判斷微博是原創仍是轉發的,判斷class=cmt的爲轉發的,首先拿到原文評論的鏈接形式,這裏用contains選擇器,第一個參數是. 表示選擇的是當前的文本  第二個參數是用文本特徵截取
24.若是是原創微博,就直接獲取評論的超連接.這樣就分了兩種狀況對詳情頁進行了抽取,接下來對微博詳情頁進行解析yield
25.定義parse_detail方法,url能夠經過response.url得到,用xpath獲取正文內容content
26.用scrapy提供的調試工具parse進行調試 scrapy parse url -c parse_detail,在用join方法把獲取的列表中的內容拼接起來。
27.在items文件裏面設置一個item,對提取到的信息進行賦值.引入Item,Field,同時構造一些字段把它構形成item,這些字段就是從網頁所提取的內容
28.在weibo.py中引入WeiboItem,並給他實例化一個對象,而後把field一個個賦值
29.在pipelines對拿到的數據進行改寫清洗,例如時間改爲合理的格式
30.定義mongopipeline,用來將數據存儲到MongoDB數據庫,首先定義一個初始化的init方法,傳入兩個參數,一個是數據庫鏈接的uri,一個是數據庫鏈接
31.from_crawler的類方法,這裏經過crawler把類的兩個參數拿到settings裏面相關的配置,這樣就能夠把上面的兩個參數放到settings裏面
32.構建open_spider方法,在spider開啓時默認調用裏面的語句,這樣能夠在裏面作一些相關的初始化操做,好比能夠把MongoClient數據庫的鏈接打開。接下來還須要建立MongoDB的鏈接數據庫的鏈接信息
33.相應的構建一個close_spider方法
34.最重要的構建process_item方法,來對item進行操做,再對數據庫進行一下插入操做,在WeiboItem裏面定義一個屬性叫table_name,再傳到process_item方法
35.接下來調用update方法,第一個參數傳入查詢的字段,此處用id來查詢,第二個參數須要傳入item,把它轉換成字典的形式,第三個參數傳入True,意味着若是查詢到該內容,就對其更新,若是沒有查到就對其插入,即去重
36.在settings中的ITEM_PIPELINES開啓調用,最後把mongo_uri和mongo_db這兩個參數寫入settings
37.針對微博的反爬蟲,處理跳轉到相似一些封號的頁面,構建process_response方法
相關文章
相關標籤/搜索