python网络爬虫学习(四)

引言

这个章节主要讲模拟登陆,因为在有些网站中,登录网页的表单数据如用户名、密码、验证码等的真实提交地址,它不一定是登录网页的地址,出于安全需要它可能会被设计成其他地址。所以我们有时就需要模拟登录网页才能使用编程控制。下面我们以模拟登录"http://www.tipdm.org"

使用表单登录方法实现模拟登录

打开网站,单击右上角登录链接,进入登录网页,如图所示:
python网络爬虫学习(四)_第1张图片
打开Chrome开发者工具后打开网络面板,勾选Preserve log(保持日志)。按"F5”键刷新网页显示各项资源,如图所示:
python网络爬虫学习(四)_第2张图片
在登录网页输入账号、秘密、验证码,单击“登录”按钮,提交表单数据,此时Chrome开发者工具会加载新的资源。
观察Chrome开发者工具左侧的资源,找到"login.jspx”资源并单击,观察右侧的Headers标签下的General信息,如图5-3所示,发现Request Method信息为POST,即请求方法为POST,可以判断Request URL信息即为提交入口。
查找表单信息(密码是通过加密的,所以无法查看到正确的密码):使用chrome开发者工具获取到的提交入口,观察Headers标签,Form Data信息为服务器端接收到的表单数据,如下图所示。其中,username表示账号;password表示密码;captcha表示验证码;returnurl表示跳转网址。returnurl系自动生成,在登录网页时无需输入。
python网络爬虫学习(四)_第3张图片
处理验证码:
处理验证码可以通过机器学习算法造成模型来识别验证,在这里之讲述最简单的一种——人工试别验证码。
人工识别验证码分为3个步骤:1.获取生成验证码的图片地址;2.
将验证码图片下载到本地;3.人工识别验证码。
首先,获取登录网页验证码地址的步骤如下:
打开网站,进入登录网页,若已登录需先退出。打开Chrome开发者工具后打开网络面板,按“F5”键刷新网页。
观察Chrome开发者工具左侧的资源,找到“captcha.svi”资源并单击,观察右侧的Preview标签,若显示验证码图片如左边图所示,则“captcha.svi"资源的Request URL信息为验证码图片的地址,如右边图所示:
python网络爬虫学习(四)_第4张图片
获取验证码图片地址后,下一步对图片地址发送请求,将图片下载到本地,最后人工打开图片识别验证码。代码流程如下:

import requests

rqq = requests.get('http://www.tipdm.org/captcha.svl')

with open('./captcha.jpg', 'wb') as f:
    f.write(rqq.content)

import matplotlib.pyplot as plt

pic = plt.imread('./captcha.jpg')
plt.imshow(pic)
plt.show()
a = input('请输入验证码:')

IP问题:
很多时候在登录后爬取过程中也会弹出验证码,当使用同一个IP长时间高频率爬取网页时,该网站的服务器可能会判定该IP在爬取数据,触发网站的安全机制,在客户端弹出验证码,只有输入验证码后,客户端的访问请求才能继续被接受和处理。每次输入验证码会比较麻烦,效率低下。而且当网站服务器多次对指定IP弹出验证码后,可能会封禁该IP,导致爬取无法进行。因此,使用代理IP的方法,使用多个IP切换跳过验证码,成为应对反爬虫的主要手段。
解决这个问题有以下方法:
a.VPN:指专用虚拟网络。国内外很多厂商都提供VPN服务,可自动更换IP,实时性高,速度快,但价格较高,适合商用。
b.IP代理池:指大量IP地址集。国内外很多厂商将IP做成代理池,提供API接口,允许用户使用程序调用,但价格也较高。
C.ADSL宽带拨号:是一种宽带上网方式。特点是断开重连会更换IP,爬虫使用这个原理更换IP,但效率低,实时性差。
对于我们自己爬虫如果面临这样的问题的话,我们可以在网上找免费的IP(挺难找的)进行更换,使用Requests库配置代理IP:

proxies = {'http': 'http://60.184.110.80:3000'}#IP已失效
requests.get('http://www.tipdm.org', proxies=proxies,headers={"Connection": "close"})

使用post方法登陆:
POST请求方法能够保障用户端提交数据的安全性,因此它被一般需要登录的网站采用。Requests库的post函数能够以POST请求方法向服务器端发送请求。

import requests
url = 'http://www.tipdm.org/login.jspx'
login = {'username': 'pc2019',
         'password': 'pc2019',
         'captcha': 'yvox'}
requests.post(url, login)

上面的是单独展示输入验证码。我们需要将人工输入验证码放在登陆的过程:

import requests
import matplotlib.pyplot as plt

s = requests.Session()
url = 'http://www.tipdm.org/login.jspx'

rqq = s.get('http://www.tipdm.org/captcha.svl')
with open('./captcha.jpg', 'wb') as f:
    f.write(rqq.content)

pic = plt.imread('./captcha.jpg')
plt.imshow(pic)
plt.show()
a = input('请输入验证码:')

login = {'username': 'pc2019',
         'password': 'pc2019',
         'captcha': a}

rqq = s.post(url, data=login)

rqq.url

s.get('http://www.tipdm.org/member/index.jspx').content.decode('utf8')  #未登录

requests.get('http://www.tipdm.org/member/index.jspx').content.decode('utf8')#已登陆```

使用浏览器Cookie登录

也是同样的例子,我们先来看看怎么手工查找该网页的Cookie:
登录网站。输入账号、密码、验证码,保证成功登录网站。找到登录成功后返回的页面地址的cookie。步骤如下:
第一步,打开chrome开发者工具后打开网络面板,按“F5"键刷新网页,出现资源。找到左侧的“index.html"资源,它代表的是本网页地址,可以看到Request URL信息与本网页地址相吻合,如图所示:
python网络爬虫学习(四)_第5张图片
观察右侧Headers标签,查看Request Headers信息,找到Cookie信息,它即为登录成功后的Cookie,将其保存下来,如图所示:
python网络爬虫学习(四)_第6张图片

cookie = 'uniqueVisitorId=a2151df1-4833-00ae-72e0-f4b99d2b7be2; pgv_pvid=2326009190; _site_id_cookie=1; clientlanguage=zh_CN; __qc_wId=658; username=pc2019; sso_logout=true; JSESSIONID=F9925FFA300D4AFD87F275194C7837CF'
Cookies = {}
for i in cookie.split(';'):
    key, value = i.split('=')
    Cookies[key] = value  #将Cookies做成字典

Cookies

import requests
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
requests.get('http://www.tipdm.org/member/index.jspx', cookies=Cookies, headers=head).content.decode('utf8')

这样登陆肯定是行的,但是他获取Cookies这一步还是不够自动,所以我们可以结合表单进行Cookies登陆,:

import requests
import matplotlib.pyplot as plt
from http.cookiejar import LWPCookieJar

s = requests.Session() #建立会话

s.cookies = LWPCookieJar('cookie')  #存储Cookies


url = 'http://www.tipdm.org/login.jspx'

rqq = s.get('http://www.tipdm.org/captcha.svl')
with open('./captcha.jpg', 'wb') as f:
    f.write(rqq.content)   #保存验证码

pic = plt.imread('./captcha.jpg')
plt.imshow(pic)
plt.show()
a = input('请输入验证码:')

login = {'username': 'pc2019',
         'password': 'pc2019',
         'captcha': a}
rqq = s.post(url, data=login)
print(rqq.url)  # 检测正常登录
s.cookies.save(ignore_discard=True, ignore_expires=True)  # save cookies

s.cookies.load(ignore_discard=True, ignore_expires=True) #加载Cookies

s.get('http://www.tipdm.org/member/index.jspx').content.decode('utf8')

其中涉及到的关于cookie加载保存等:
存储和加载Cookie需要用到http库的cookiejar模块,它提供可存储Cookie的对象。cookiejar模块下的FileCookielar用于将Cookie保存到本地磁盘和从本地磁盘加载Cookie文件,LWPCookielar是FileCookielar的子类。LWPCookielar对象存储和加载的Cookie文件格式为Set-Cookie3,是比较常用的一种,也是本章节需要用的。创建LWPCookielar对象的函数是LWPCookielar。

你可能感兴趣的:(网络爬虫,python)