python网络爬虫之使用scrapy自动登录网站
前面曾经介绍过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自动登录网站的更多相关文章
- python网络爬虫之使用scrapy自动爬取多个网页
前面介绍的scrapy爬虫只能爬取单个网页.如果我们想爬取多个网页.比如网上的小说该如何如何操作呢.比如下面的这样的结构.是小说的第一篇.可以点击返回目录还是下一页 对应的网页代码: 我们再看进入后面 ...
- 【python 网络爬虫】之scrapy系列
网络爬虫之scripy系列 [scrapy网络爬虫]之0 爬虫与反扒 [scrapy网络爬虫]之一 scrapy框架简介和基础应用 [scrapy网络爬虫]之二 持久化操作 [scrapy网络爬虫]之 ...
- Python 网络爬虫 002 (入门) 爬取一个网站之前,要了解的知识
网站站点的背景调研 1. 检查 robots.txt 网站都会定义robots.txt 文件,这个文件就是给 网络爬虫 来了解爬取该网站时存在哪些限制.当然了,这个限制仅仅只是一个建议,你可以遵守,也 ...
- python网络爬虫之使用scrapy下载文件
前面介绍了ImagesPipeline用于下载图片,Scrapy还提供了FilesPipeline用与文件下载.和之前的ImagesPipeline一样,FilesPipeline使用时只需要通过it ...
- python网络爬虫之使用scrapy爬取图片
在前面的章节中都介绍了scrapy如何爬取网页数据,今天介绍下如何爬取图片. 下载图片需要用到ImagesPipeline这个类,首先介绍下工作流程: 1 首先需要在一个爬虫中,获取到图片的url并存 ...
- PYTHON网络爬虫与信息提取[scrapy框架应用](单元十、十一)
scrapy 常用命令 startproject 创建一个新的工程 scrapy startproject <name>[dir] genspider 创建一个爬虫 ...
- 【python网络爬虫】之requests相关模块
python网络爬虫的学习第一步 [python网络爬虫]之0 爬虫与反扒 [python网络爬虫]之一 简单介绍 [python网络爬虫]之二 python uillib库 [python网络爬虫] ...
- 《实战Python网络爬虫》- 感想
端午节假期过了,之前一直在做出行准备,后面旅游完又休息了一下,最近才恢复状态. 端午假期最后一天收到一个快递,回去打开,发现是微信抽奖中的一本书,黄永祥的<实战Python网络爬虫>. 去 ...
- 第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用、自动限速、自定义spider的settings,对抗反爬机制
第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用.自动限速.自定义spider的settings,对抗反爬机制 cookie禁用 就是在Scrapy的配置文件set ...
随机推荐
- Spring Cloud Stream介绍-Spring Cloud学习第八天(非原创)
文章大纲 一.什么是Spring Cloud Stream二.Spring Cloud Stream使用介绍三.Spring Cloud Stream使用细节四.参考文章 一.什么是Spring Cl ...
- Css 基础学习
css 基本选择器 css基本选择器有三种方法 第一种: class选择器 .c1{ color: red;} <div class='c1'>hello world</div> ...
- IntelliJ IDEA设置鼠标移动到方法上提示API注释
参考: https://www.cnblogs.com/guazi/p/6474426.html(图片转自此篇文章)
- Win7下搭建外网环境的SVN服务器
最近想跟一帮朋友做点东西,由于几个朋友都身处异地,要想实现版本控制,只能自己搭建一个小的服务器,通过互联网环境来实现版本控制了.本来也在网上找了好多资料,但是总是缺少一些必要的信息,导致最后连接不上服 ...
- 从Android动画到贝塞尔曲线
基础知识: 动画通过连续播放一系列画面,给视觉造成连续变化的图画.很通俗的一种解释.也很好理解.那么我们先来一个案例看看. 动画案例:百度贴吧小熊奔跑 效果: topic.gif 代码: <?x ...
- WEB API 返回类型设置为JSON 【转】
http://blog.sina.com.cn/s/blog_60ba16ed0102uzc7.html web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返 ...
- spark-submit提交方式测试Demo
写一个小小的Demo测试一下Spark提交程序的流程 Maven的pom文件 <properties> <maven.compiler.source>1.7</maven ...
- PHP中读取文件的几个方法
整理了一下PHP中读取文件的几个方法,方便以后查阅. 1.fread string fread ( int $handle , int $length ) fread() 从 handle 指向的文件 ...
- Shell脚本之:替换
转义字符 #!/bin/bash a= echo -e "Value of a is $a \n" 使用-e表示对转义字符进行替换,默认情况是不转义的 命令替换 命令替换的语法,注 ...
- 在EA中用ER图生成数据库
ER图 E-R图也称实体-联系图(Entity Relationship Diagram).提供了表示实体类型.属性和联系的方法.用来描写叙述现实世界的概念模型. 实体就是看的见摸得着或者能被人感知接 ...
