python爬虫登录网站_python网络爬虫之使用scrapy自动登录网站

前面曾经介绍过requests实现自动登录的方法。这里介绍下使用scrapy如何实现自动登录。还是以csdn网站为例。

Scrapy使用FormRequest来登录并递交数据给服务器。只是带有额外的formdata参数用来传送登录的表单信息(用户名和密码),为了使用这个类,需要使用以下语句导入:from scrapy.http import FormRequest

那么关于登录过程中使用cookie值,scrapy会自动为我们处理cookie,只要我们登录成功了,它就会像一个浏览器一样自动传送cookie

首先爬虫中定义start_requests

defstart_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中调用的

接下来的参数是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。从下面的红色标红部分可以看到。在向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) (referer: None)

2017-10-16 22:17:34 [scrapy] DEBUG: Crawled (200) (referer: None)

2017-10-16 22:17:34 [scrapy] DEBUG: Crawled (200) (referer: http://www.csdn.net/)2017-10-16 22:17:35 [scrapy] DEBUG: Crawled (200) (referer: None)

2017-10-16 22:17:35 [scrapy] DEBUG: Crawled (200) (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值

1183125-20171017224112865-1271822373.png

完整的代码:

# -*- 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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值