利用scrapy登錄豆瓣
一摔竿、網(wǎng)頁分析
豆瓣的登錄頁面如上面粮,如果你是第一次登陸是不需要輸入驗證碼的,當多次登錄失敗后將出現(xiàn)驗證碼继低。
點擊登錄并抓包熬苍,得到如下的參數(shù)
其中form_email和form_password分別是用戶名和密碼,captcha-solution是輸入的驗證碼袁翁, captcha-id為驗證碼id柴底, 在對登錄網(wǎng)址進行get請求時可以得到
這樣我們就能大概有了一個思路:
首先get請求登錄頁面, 若有驗證碼則保存本地粱胜, 并提取出captcha-id柄驻, 之后post請求登錄頁,完成登錄過程焙压, 若無驗證碼則直接發(fā)送post請求鸿脓。整體流程沒有難度, 所有字段都是明文涯曲,沒有任何加密野哭。
二、代碼實現(xiàn)
scrapy的項目結構如下:
編寫start.py腳本用于啟動scrapy:
from scrapy import cmdline
if __name__ == '__main__':
cmdline.execute('scrapy crawl db'.split())
主要代碼db.py
import scrapy
from PIL import Image
import urllib
class DbSpider(scrapy.Spider):
name = "db"
# allowed_domains = ["douban.com"]
start_urls = (
'https://accounts.douban.com/login',
)
def parse(self, response):
captcha =response.xpath("http://img[@id='captcha_image']/@src").extract_first()
if captcha:
print captcha
print 'find captcha...'
urllib.urlretrieve(captcha, 'captcha.jpg')
Image.open('captcha.jpg')
cap = raw_input('input captcha manually:')
captcha_id = response.xpath("http://input[@name='captcha-id']/@value").extract_first()
print captcha_id
yield scrapy.FormRequest(
url='https://accounts.douban.com/login',
formdata={
'source': 'None',
'redir': 'https://www.douban.com /',
'form_email': 'xxxxxxxx',
'form_password': 'xxxxxxxx',
'login': '登錄',
'captcha-solution': cap,
'captcha-id': captcha_id
},
callback=self.parse_after_login,
)
else:
print 'no captcha'
yield scrapy.FormRequest(
url='https://accounts.douban.com/login',
formdata={
'source': 'None',
'redir': 'https://www.douban.com /',
'form_email': 'xxxxxxx',
'form_password': 'xxxxxx',
'login': '登錄',
},
callback=self.parse_after_login,
)
def parse_after_login(self, response):
print response.url
if 'caelansar' in response.body: # 如果用戶名在頁面中幻件,則登錄成功
print 'login success'
else:
print 'fail'
需要注意的是拨黔,必須要在setting中設置USER_AGENT, 否則訪問登錄頁將出現(xiàn)403錯誤傲武。