Python Scrapy 驗證碼登錄處理


一、Form表單分析

   以豆瓣登錄頁面為例分析,豆瓣登錄頁是:https://accounts.douban.com/login,瀏覽器打開之后查看源碼,查找登錄的form表單HTML結構。如下:

   包括了form_email、form_password、captcha-solution四個表單參數,需要注意之處是name,而不是id。

 

二、驗證碼圖片處理

   1、分析驗證碼參數圖片的構建如下圖,獲取id為captcha_image的src圖片即可。可以采用人工輸入,或第三方圖片驗證碼識別API獲得。

  2、點擊該url,圖片是:

 獲取url之后,使用urllib.request.urlretrieve(url,filename="d:/captcha.jpg")下載圖片

  3、接下來通過python腳本獲取該圖片,保存在本地,在python命令行中采用input()方式,人工識別后輸入該驗證碼:captcha_value = credit。

三、登錄參數構建

   通過預先注冊的用戶名、密碼,獲得驗證碼,構建表單參數如下:

data={
"form_email":"XXXXX",
"form_password":"******",
"captcha-solution":captcha_value,
}

四、Session參數存儲

1、cookiejar學習:http://cuiqingcai.com/968.html

2、在request參數中指定cookiejar,如下:

   首次訪問目標網站:

  構建登錄參數后,開始登錄。

 

 

五、登錄后數據爬取

   通過formdata認證通過后,在回調函數crawlerdata中處理爬取的網頁,通過response對象進行數據解析。

六、主要代碼  

import scrapy
from scrapy.http import Request,FormRequest
import urllib.request
class DoubanSpider(scrapy.Spider):
name = "Douban"
allowed_domains = ["douban.com"]

UserAgent = {"User-Agent:":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2050.400 QQBrowser/9.5.10169.400"}

def start_requests(self):
return [Request("https://accounts.douban.com/login",callback=self.Login,meta={"cookiejar":1})]

def Login(self, response):
captcha = response.xpath("//img[@id='captcha_image']/@src").extract()
url = "https://accounts.douban.com/login"
print("正在保存驗證碼圖片")
captchapicfile = "F:/20_Python/2000_PythonData/SelfStudy/douban/douban/captcha.png"
urllib.request.urlretrieve(captcha[0],filename = captchapicfile)
print("打開圖片文件,查看驗證碼,輸入單詞......")
captcha_value = input()

data = {
"form_email":"XXXX",
"form_password":"XXXX",
"captcha-solution":captcha_value,
}
print("正在登陸中……")
return [FormRequest.from_response(response,
meta={"cookiejar":response.meta["cookiejar"]},
headers = self.UserAgent,
formdata = data,
callback=self.crawlerdata,
)]

def crawlerdata(self,response):
print("完成登錄.........")
title = response.xpath("/html/head/title/text()").extract()
content2 = response.xpath("//meta[@name='description']/@content").extract()
print(title[0])
print(content2[0])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM