python3 scrapy模擬登陸豆瓣

首先感謝知乎,在我遇到問題時提問有人及時幫助解決。問題在下面說。

1。遇到的問題

由於程序沒有做後續的數據處理,所以沒有用到pipelines,只在爬蟲文件裏編輯,在模擬瀏覽器時也將也將瀏覽器header寫在db.py文件中,在知乎得到答案,USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36',將之寫入settings中就可以正常驗證登陸。

2。具體過程

1,進入目錄創建scrapy項目scrapy startproject douban
2,進入dangdang,創建爬蟲文件scrapy genspider -t basic db douban.com
3,判斷是否出現驗證碼(如果出現驗證碼,則使用xpath獲取驗證碼地址肯定大於0,否則沒有驗證碼直接登陸),通過瀏覽器抓包分析,得到登錄時的from_password及from_email字段。
打開瀏覽器豆瓣登陸界面,使用chrome檢查下的network,
這裏寫圖片描述
觸發一次登陸後,我們的到所要的字段,這些信息就是我們所要的data信息
這裏寫圖片描述
編寫db.py文件
具體代碼如下:

import scrapy
import urllib.request
from scrapy import Request
class DbSpider(scrapy.Spider):
    name = 'db'
    allowed_domains = ['douban.com']
    #start_urls = ['http://douban.com/']
    def start_requests(self):#該方法必須返回一個可迭代對象。該對象包含了spider用於爬取的第一個Request。當spider啓動爬取並且未制定URL時,該方法被調用。meta參數的作用是傳遞信息給下一個函數,下面start_requests中鍵‘cookiejar’是一個特殊的鍵,scrapy在meta中見到此鍵後,會自動將cookie傳遞到要callback的函數中。既然是鍵(key),就需要有值(value)與之對應,例子中給了數字1,也可以是其他值,比如任意一個字符串。可以理解爲:再次刷新網頁時不丟失登陸信息?
        return [Request('https://accounts.douban.com/login?',callback=self.parse,meta={'cookiejar':1})]

    def parse(self, response):
        capt = response.xpath('//div/img[@id="captcha_image"]/@src').extract()#獲取驗證碼地址
        url = 'https://accounts.douban.com/login'
        print(capt)
        if len(capt)>0:#判斷是否有驗證
            print('有驗證碼')
            local_path = 'capt.jpeg'
            urllib.request.urlretrieve(capt[0], filename=local_path)#保存驗證碼到本地
            print('查看本地驗證碼圖片並輸入')
            capt_id = response.xpath('//div/input[@name="captcha-id"]/@value').extract()
            captcha_value = input()#驗證碼
            data = {#均從chrome瀏覽器檢查及查看源碼抓包來
                    'form_email': '********',#郵箱賬號
                    'form_password': '********',#密碼
                    'captcha-solution': captcha_value,
                    'source':'index_nav',
                    'captcha-id':capt_id,
                    'redir': 'https://www.douban.com/people/174174633/'#登陸成功要返回的link,我們返回主頁
                    }
        else:
            print('沒有驗證碼')
            data = {
                    'form_email':'********',#賬號
                    'form_password':'*********',#密碼
                    'source':'index_nav',
                    'redir':'https://www.douban.com/people/174174633/'
                    }
            print('login...')
        return [#使用Scrapy抓取網頁時,如果想要預填充或重寫像用戶名、用戶密碼這些表單字段, 可以使用 FormRequest.from_response() 方法實現
            scrapy.FormRequest.from_response(response,
            meta={'cookiejar':response.meta['cookiejar']},
            dont_filter=False,
            formdata=data,
            callback=self.after_login)
            ]
    def after_login(self,response):#要爬的數據
        print('logined')
        summary = response.xpath('//*[@id="intro_display"]/text()').extract()#獲取登陸後的簡介
        print(summary[0])

4,scrapy crawl db --nolog執行,得到結果爲:
這裏寫圖片描述
其中下載的驗證碼
這裏寫圖片描述

發佈了71 篇原創文章 · 獲贊 47 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章