首先還是創(chuàng)建爬蟲,其命令如下:
#01.創(chuàng)建 Scrapy 項目
scrapy startproject simulate_login
#02. 進入 simulate_login目錄下芭梯,創(chuàng)建爬蟲
scrapy genspider your_spider douban.com
模擬登陸豆瓣的關(guān)鍵點
1险耀、分析真實post地址,尋找formdata玖喘;
2甩牺、模擬post,構(gòu)造類似的formdata累奈;
3贬派、處理驗證碼。
豆瓣登陸地址為https://accounts.douban.com/login
,進入登陸界面澎媒,我們首先輸入賬號和密碼搞乏,密碼故意輸錯,然后輸入正確的驗證碼戒努。按F12分析真實的post地址---请敦,尋找他的formdata,如下圖:
捕獲.PNG
實戰(zhàn)操作:
幾個注意事項:
1储玫、注意Python2和Python3的部分語法區(qū)別侍筛;
2、注意根據(jù)自己的實際情況撒穷,填寫headers部分匣椰。
到2018年8月10日為止,該方法還可以登陸豆瓣端礼。下面貼出主要代碼:
# -*- coding: utf-8 -*-
import scrapy
import urllib,re
from scrapy.http import Request,FormRequest
class YourSpiderSpider(scrapy.Spider):
name = 'your_spider'
allowed_domains = ['douban.com']
#start_urls = ['http://douban.com/']
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36"} #供登錄模擬使用
def start_requests(self):
url='https://www.douban.com/accounts/login'
#return [Request(url=url,meta={"cookiejar":1},callback=self.parse)]#可以傳遞一個標示符來使用多個禽笑。如meta={'cookiejar': 1}這句,后面那個1就是標示符
return [scrapy.FormRequest("https://accounts.douban.com/login", headers=self.headers, meta={"cookiejar":1}, callback=self.parse)]
def get_content(self, response):
title = response.xpath('//title/text()').extract()[0]
if u'登錄豆瓣' in title:
print("登錄失敗齐媒,請重試")
else:
print("登陸成功")
def parse(self, response):
captcha = response.xpath('//*[@id="captcha_image"]/@src').extract()
print(captcha)
if len(captcha)>0:
#有驗證碼蒲每,人工輸入驗證碼
urllib.request.urlretrieve(captcha[0],filename=r"C:\Users\LBX\your_project\simulate_login\simulate_login\captcha.png")
captcha_value=input('查看captcha.png,有驗證碼請輸入:')
data={
"form_email":"18353113181@163.com",
"form_password":"9241113minda",
"captcha-solution":captcha_value,
}
else:
#此時沒有驗證碼
print("無驗證碼")
data={
"form_email":"18353113181@163.com",
"form_password":"9241113minda",
}
print("正在登陸中.....")
#進行登錄
return[
FormRequest.from_response(
response,
meta={"cookiejar":response.meta["cookiejar"]},
headers=self.headers,
formdata=data,
callback=self.get_content,
)
]