1. 程式人生 > >Python資料爬蟲學習筆記(19)Scrapy模擬登入實現豆瓣使用者資訊爬蟲

Python資料爬蟲學習筆記(19)Scrapy模擬登入實現豆瓣使用者資訊爬蟲

一、需求:在豆瓣官網中,使用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、之後輸入驗證碼,即可檢視爬取結果:

感謝韋瑋老師的指導