Python資料爬蟲學習筆記(19)Scrapy模擬登入實現豆瓣使用者資訊爬蟲
阿新 • • 發佈:2019-02-01
一、需求:在豆瓣官網中,使用Scrapy實現模擬登入,並爬取登入後的個人中心介面中的使用者名稱及日記資訊資料。
二、實現思路:
1、關於使用者名稱與密碼以及其提交網址:
觀察登入網頁的原始碼,注意到使用者名稱與密碼都使用不同name屬性的input來輸入。
登入資訊的提交網址為,這個網址可以在原始碼中找到,但是非常建議使用Fiddler進行抓包分析得到,方法是首先對Fiddler進行clear,然後故意輸入錯誤的使用者名稱密碼,點選登入,Fiddler立即回抓到登入資訊的提交連結:
2、關於爬取的資訊:
1)使用者名稱稱:在網頁的title標籤中。
2)日記內容:被class屬性為note的div標籤所包圍。
2、關於處理豆瓣的反爬機制:
2)登入驗證碼,採用半自動輸入的方式,在實際工作時可以使用打碼api實現。
三、編寫Scrapy專案程式碼:
1、settings.py(非常重要):
#非常重要!否則執行爬蟲會報crawl(403)的錯誤,無法爬取資訊 DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, } ROBOTSTXT_OBEY = False
2、soubanSpider.py(筆者建立的Scrapy爬蟲檔案):
import scrapy from scrapy.http import Request,FormRequest #匯入用於爬取網頁驗證碼 import urllib.request class DoubanspiderSpider(scrapy.Spider): name = 'doubanSpider' allowed_domains = ['douban.com'] #瀏覽器的header header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36 OPR/54.0.2952.71"} #start_urls = ['http://www.douban.com/'] #設定提交登入資訊的網址,注意要設定cookie儲存登入資訊以實現連續爬取 def start_requests(self): return [Request("https://accounts.douban.com/login", callback=self.parse, meta={"cookiejar": 1})] #處理資料的方法 def parse(self, response): #嘗試獲取網頁中的驗證碼連結 captcha = response.xpath("//img[@id='captcha_image']/@src").extract() #根據是否爬取到了驗證碼圖片執行相關處理 if len(captcha) > 0: print("此時有驗證碼") #爬取驗證碼圖片至本地,提示使用者進行輸入 localpath = "E:/Scrapy/result/captcha.png" urllib.request.urlretrieve(captcha[0], filename=localpath) print("請檢視本地驗證碼圖片並輸入驗證碼") captcha_value = input() #設定需要提交至登入URL的資料,包括使用者名稱、密碼、驗證碼以及登入成功的回撥頁 data = { "form_email": "正確的使用者名稱", "form_password": "正確的對應密碼", "captcha-solution": captcha_value, "redir": "https://www.douban.com/people/164741792/", } else: print("此時沒有驗證碼") #設定需要提交至登入URL的資料,包括使用者名稱、密碼以及登入成功的回撥頁 data = { "form_email": "正確的使用者名稱", "form_password": "正確的對應密碼", "redir": "https://www.douban.com/people/164741792/", } print("登入……") #登入成功後執行後續方法 return [FormRequest.from_response(response, meta={"cookiejar": response.meta["cookiejar"]}, headers=self.header, formdata=data, callback=self.next, )] #登入成功後,提取使用者資訊 def next(self, response): print("此時已經登陸完成並爬取了個人中心的資料") title = response.xpath("/html/head/title/text()").extract() note = response.xpath("//div[@class='note']/text()").extract() print(title[0]) print(note[0])
四、執行結果:
1、輸入命令執行爬蟲,等待出現輸入驗證碼提示:
2、到對應目錄檢視驗證碼圖片,本博文儲存在E盤Scrapy的result資料夾中:
3、之後輸入驗證碼,即可檢視爬取結果: