Python爬虫 --登录页面除了Cookie,另外一种进行登录的方式

仅以此文,记录被一个登陆页面阻挡了一天的爬虫小白。


接到一个爬虫需求:从一个页面获取列表信息,页面如下

Python爬虫 --登录页面除了Cookie,另外一种进行登录的方式

当时的心理活动是,向网站发送请求,将反馈的html文件,通过Beautifulsoup转化,抓取所需要的数据,这么一套操作就可以了吧,于是复制了之前爬虫的代码开头。【这段开头有之前编写脚本的心血,能起到微不足道的反反爬虫作用】

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import urllib
import urllib2
import sys
import re
import datetime
# 更改代理,让页面无法屏蔽掉爬虫程序
starttime = datetime.datetime.now()
reload(sys)
sys.setdefaultencoding('cp936')
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({'http':'http://some-proxy.com:8080'})
null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:
    opener = urllib2.build_opener(proxy_handler)
else:
    opener = urllib2.build_opener(null_proxy_handler)

# 打印系统登录日志
#httpHandler = urllib2.HTTPHandler(debuglevel=1)
#opener2 = urllib2.build_opener(httpHandler)
#urllib2.install_opener(opener2)

url = 'http://888/flow/all' #改下网址就可以了
user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
headers = {'User-Agent':user_agent}
request = urllib2.Request(url,headers=headers)
response = urllib2.urlopen(request).read()
    #.decode('utf-8')
#通过timeout = 10 ,可以屏蔽页面相应超过10秒以上的程序

soup = BeautifulSoup(response, 'lxml')

当时,一评估工作量,我心想,列表获取之前做过,唯一难一点的就是翻页,也不复杂,大约3个小时左右吧,就能抓完,生成excel文件。

算盘打的挺好的,领导这个时候说,这个网址需要登录啊,我给你账号密码。

其实,一开始自己还是很乐观的,登录的话之前看过,只要在调用页面时间加入cookie就可以解决了。所以难点就在于怎么获取cookie,以及怎么将获取的cookie插入请求中就可以了。

于是,打开****,搜索:Python爬虫 如何获取cookie;Python爬虫 插入Cookie

但是,不知道我定位的有问题,还是网页存在反爬虫,按照前辈的代码模仿生成的内容,没有生效,返回的是一个跳转页面。

失败代码1

# -*- coding:UTF-8 -*-
import requests
from bs4 import BeautifulSoup
import cookielib
import urllib2

#post 登录信息,生成cookie文件
session = requests.Session()
session.cookies = cookielib.LWPCookieJar('cookie')
agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'

headers = {
    "Host":'www.****.com',#****部分是网址域名,如:www.baidu.com
    "Origin" : 'https://*****/web',
    "Referer" : 'http://*****/web',
    'User-Agent': agent
}

postdata = {
    'username' : u'****',#账号
    'password' : '****',#密码
    'submit' : u'登录',#下面两个是网站要求的剩余两个cookie字段,至于怎么获取的,如果有问题可以和博主一起交流
    'token' : 'd49087d2'
}
response = session.get('http://www.****.com/web/index.php?c=site&a=entry&method=tuiguang&p=creditshop&type=2&dy=2&do=plugin&m=zuizan_shop',headers = headers)
soup = BeautifulSoup(response.content,'html.parser')

result = session.post('http://www.****.com/web/index.php?c=site&a=entry&method=tuiguang&p=creditshop&type=2&dy=2&do=plugin&m=zuizan_shop',data=postdata, headers = headers)

requests = urllib2.Request('http://www.****.com/web/index.php?c=site&a=entry&method=tuiguang&p=creditshop&type=2&dy=2&do=plugin&m=zuizan_shop', headers = headers)
response = urllib2.urlopen(requests).read()
soup = BeautifulSoup(response, 'lxml')

print soup

这个尝试之后,实际上是获取了一套html,但是不是抓取目标所在的页面!那个页面怎么也跳转不到。当时感觉,卧槽,是不是被反爬虫搞了!


由于,本人是个测试,会点自动化,于是抓住了一根救命稻草,selenium!也就是自动化测试的思想,将进入需求页所有操作录制为脚本由系统执行。通过这种方式实现使用账号密码登录系统的功能 易如反掌!

果然不出所料,很快攻克了登录问题。这个时候,出现了一个新的页面

Python爬虫 --登录页面除了Cookie,另外一种进行登录的方式

其实这个页面也没什么,点击之后会能够跳转过去,selenium轻松就能搞定!但是问题是,selenium执行后跳转的页面,和在web端执行的页面不一致呀!会生成一个新的窗口!

心中各种mmp!纠结了1个小时,我都打算放弃了!这个时候我在想,自动化如果遇到这种情况,难道就进行不下去了么?于是搜索了下!果然还真有解决方案:给我帮助最大的博文,链接先不放,题目是这个,需要的童鞋可以自行查询

selenium+python自动化测试(五)--多窗口切换

于是乎,成功完成了页面的跳转。解决了登录之后,进入到抓取数据页面的问题


这种方法的弊端:

1. 登录如果存在复杂校验,selenium方式想要跳过校验,非常困难;如果遇到校验非常复杂的,还是想其他方法吧,比如cookie,不过目前还没尝试成功过。。。