python網路爬蟲之使用scrapy自動登入網站

來源:互聯網
上載者:User

標籤:username   網路   表單   callback   特殊   art   turn   account   post   

前面曾經介紹過requests實現自動登入的方法。這裡介紹下使用scrapy如何?自動登入。還是以csdn網站為例。
Scrapy使用FormRequest來登入並遞交資料給伺服器。只是帶有額外的formdata參數用來傳送登入的表單資訊(使用者名稱和密碼),為了使用這個類,需要使用以下語句匯入:from scrapy.http import FormRequest
那麼關於登入過程中使用cookie值,scrapy會自動為我們處理cookie,只要我們登入成功了,它就會像一個瀏覽器一樣自動傳送cookie
首先爬蟲中定義start_requests
def start_requests(self):

    return [Request("http://passport.csdn.net/account/login",meta={‘cookiejar‘:1},callback=self.post_login,method="POST")]
 

其中採用Requests的方法首先訪問登入網站。meta屬性是字典,字典格式即{‘key’:‘value‘},字典是一種可變容器模型,可儲存任意類型對象。

request中meta參數的作用是傳遞資訊給下一個函數,這些資訊可以是任意類型的,比如值、字串、列表、字典......方法是把要傳遞的資訊賦值給meta字典的鍵. 上面start_requests中鍵‘cookiejar’是一個特殊的鍵,scrapy在meta中見到此鍵後,會自動將cookie傳遞到要callback的函數中。既然是鍵(key),就需要有值(value)與之對應,例子中給了數字1,也可以是其他值,比如任意一個字串。

Callback就是串連到了登入網站後下一步需要調的函數。下面來看下post_login如何?

def post_login(self,response):
html=BeautifulSoup(response.text,"html.parser")
for input in html.find_all(‘input‘):
if ‘name‘ in input.attrs and input.attrs[‘name‘] == ‘lt‘:
lt=input.attrs[‘value‘]
if ‘name‘ in input.attrs and input.attrs[‘name‘] == ‘execution‘:
e1=input.attrs[‘value‘]
data={‘username‘:‘xxxx‘,‘password‘:‘xxxxx‘,‘lt‘:lt,‘execution‘:e1,‘_eventId‘:‘submit‘}
return [FormRequest.from_response(response,
meta={‘cookiejar‘:response.meta[‘cookiejar‘]},
headers=self.header,
formdata=data,
callback=self.after_login,)]

首先是擷取lt,execution欄位的值,具體在之前介紹requests的文章中有解釋。

然後調用FormRequest.from_response。 這個方法的作用是從response中返回的網頁中構造表單資料,因此第一個參數是response。這裡response返回的網頁也就是前面Requests中調用的http://passport.csdn.net/account/login

接下來的參數是meta。Heasers,formadata以及callback。這裡的callback有就是指向登入後的函數。

after_login的實現如下。

def after_login(self,response):
print ‘after login‘
print response.status
header={‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36‘}
return [Request("http://my.csdn.net/my/mycsdn",meta={‘cookiejar‘:response.meta[‘cookiejar‘]},headers=header,callback=self.parse)]
def parse(self, response):
print response.text.decode(‘utf-8‘).encode(self.type)
運行後我們來看下記錄的log。從下面的紅色標紅部分可以看到。在向http://passport.csdn.net/account/login發起登入請求後,scrapy緊接著
向http://passport.csdn.net/account/login;jsessionid=8B4A62EA09BBB5F1FBF4D921B64FECE6.tomcat2  發起建立請求。這也就是調用FormRequest.from_response觸發的。在這裡後面串連的jsessionid值也就是之前在訪問登入網站的時候擷取的會話ID,在這裡scrapy自動給添加上了
2017-10-16 22:17:34 [scrapy] INFO: Spider opened
2017-10-16 22:17:34 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2017-10-16 22:17:34 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-10-16 22:17:34 [scrapy] DEBUG: Crawled (404) <GET http://passport.csdn.net/robots.txt> (referer: None)
2017-10-16 22:17:34 [scrapy] DEBUG: Crawled (200) <POST http://passport.csdn.net/account/login> (referer: None)
2017-10-16 22:17:34 [scrapy] DEBUG: Crawled (200) <POST http://passport.csdn.net/account/login;jsessionid=8B4A62EA09BBB5F1FBF4D921B64FECE6.tomcat2> (referer: http://www.csdn.net/)
2017-10-16 22:17:35 [scrapy] DEBUG: Crawled (200) <GET http://my.csdn.net/robots.txt> (referer: None)
2017-10-16 22:17:35 [scrapy] DEBUG: Crawled (200) <GET http://my.csdn.net/my/mycsdn> (referer: http://passport.csdn.net/account/login;jsessionid=8B4A62EA09BBB5F1FBF4D921B64FECE6.tomcat2)
2017-10-16 22:17:35 [scrapy] INFO: Closing spider (finished)
2017-10-16 22:17:35 [scrapy] INFO: Dumping Scrapy stats:
{‘downloader/request_bytes‘: 2022,
從fiddler中抓取的資料可以看到jsessionid是在訪問登入網站後,網站返回的response 訊息的header訊息中。也就是網站設定的cookie值
完整的代碼:
# -*- coding:UTF-8 -*- #
from scrapy.spiders import Spider,CrawlSpider,Rule
from scrapy.selector import Selector
from scrapy.http import Request
from scrapy import FormRequest

from test2.items import Test2Item
from scrapy.utils.response import open_in_browser
from scrapy.linkextractors import LinkExtractor
from bs4 import BeautifulSoup
import sys


class testSpider(Spider):
name="test2"
allowd_domains=[‘http://www.csdn.net/‘]
header={‘host‘:‘passport.csdn.net‘,‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36‘,‘Referer‘:‘http://www.csdn.net/‘}
start_urls=["http://www.csdn.net/"]
reload(sys)
sys.setdefaultencoding(‘utf-8‘)
type = sys.getfilesystemencoding()
def start_requests(self):

return [Request("http://passport.csdn.net/account/login",meta={‘cookiejar‘:1},callback=self.post_login,method="POST")]

def post_login(self,response):
html=BeautifulSoup(response.text,"html.parser")
for input in html.find_all(‘input‘):
if ‘name‘ in input.attrs and input.attrs[‘name‘] == ‘lt‘:
lt=input.attrs[‘value‘]
if ‘name‘ in input.attrs and input.attrs[‘name‘] == ‘execution‘:
e1=input.attrs[‘value‘]
data={‘username‘:‘xxxx‘,‘password‘:‘xxxxx‘,‘lt‘:lt,‘execution‘:e1,‘_eventId‘:‘submit‘}
return [FormRequest.from_response(response,
meta={‘cookiejar‘:response.meta[‘cookiejar‘]},
headers=self.header,
formdata=data,
callback=self.after_login,)]
def after_login(self,response):
print ‘after login‘
print response.status
header={‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36‘}
return [Request("http://my.csdn.net/my/mycsdn",meta={‘cookiejar‘:response.meta[‘cookiejar‘]},headers=header,callback=self.parse)]
def parse(self, response):
print response.text.decode(‘utf-8‘).encode(self.type)
 

python網路爬蟲之使用scrapy自動登入網站

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.