1.前言
好久没有写过笔记了....本来这节内容是模拟登录人人网,但是人人网现在无法注册了...就换了家网站。这个代码是可以模拟登录古诗词网,进入登录成功后跳转的页面后,再进入个人收藏界面,获取个人收藏信息。
2.学习内容
首先编码流程分为三部 #1.验证码的识别 ,获取验证码图片的文字数据 #2.对post请求进行发动(处理请求参数) #3.对响应数据进行持久化存储
import requests from lxml import etree from chaojiying import Chaojiying_Client
先导包,注意chaojiying模块的导入方法!从chaojiying文件(模块)中导入Chaojiying_Client这个类。
第一步,获取登录页面的所有信息
url='https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3877.400 QQBrowser/10.8.4508.400' } page_text=requests.get(url=url,headers=headers).text
第二步,使用xpath方法提取图片xpath路径,直接点击右键即可获取
tree=etree.HTML(page_text) try:#把这个解决列表返回空值与调用自己模块的方法记下来!!!以及try中包含的内容,否则会找不到变量 code_img_src='https://so.gushiwen.cn'+tree.xpath('//*[@id="imgCode"]/@src')[0] code_img_data=requests.get(url=code_img_src,headers=headers).content with open('./code.jpg','wb') as fp: fp.write(code_img_data) except IndexError: pass
这里有个小bug,当我不使用try与except时,line3列表总是显示超出索引,获取不到值,所以直接except掉就行。
到这里已经获取到了验证码信息,接下来就是使用超级鹰识别验证码。
#使用超级鹰的示例代码进行图片识别 if __name__ == '__main__': chaojiying = Chaojiying_Client('账号', '密码, 'ID') #用户中心>>软件ID 生成一个替换 96001 im = open('./code.jpg', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要// print(chaojiying.PostPic(im, 1902))
注意要观察自己的验证码代号是什么,并去解码网站寻找相应验证码类型号
接下来就是模拟登录古诗词网,古诗词网的请求为get请求,不需要封装参数。但是有的网站为post请求,需要封装参数。我先介绍post的请求的情况
#post请求的发送(模拟登录) #login_url='code_img_src='https://so.gushiwen.cn'+tree.xpath('//*[@id="imgCode"]/@src')[0]' #data={ #'user': '账号', #'pass': '密码', #'imgtxt': 'chaojiying.PostPic(im, 1902)', #'act': '1', #}
注意此处的url为登录界面的url,post请求带参数,要参数封装。、
下面是get请求的
response=requsets.get(url=login_url,headers=headers) print(response.status_code)#验证是否请求成功,若为200,则请求成功,
可以先打印一下(response.status_code),若为200,则表示登陆成功。
最后将获取到的数据显示到html文档中
login_page_text=response.text with open('renren.html','w',encoding='utf-8') as fp: fp.write(login_page_text)
这时候就登录成功了,进入了登录后的界面,但是我们的目的是再进入个人收藏界面获取个人收藏信息。所以应该先获取个人收藏页面的url,再对其发请求就行了。但是直接这样写会发生错误,因为服务器不知道我们是登录成功后才对个人收藏页面发起的请求。所以此次结果会直接获取的是登录界面的数据。这时候就需要cookie了!它是在登录成功后才有的,我们通过在个人收藏页面f12获取cookie,并将其封装到headers中,这样,再对个人收藏页面发送请求,服务器就知道我们是登陆成功后才获取的个人收藏信息啦
有两种cookie处理方式,手动与自动
先介绍手动方式。
先封装cookie,此处的cookie是个人收藏页面的cookie
# headers={ # 'Cookie':'xx' # }
在对其访问以及持久化存储
detail_page_text=requsets.get(url=detail_url,headers=headers).text with open('bobo.html','w',encoding='utf-8') as fp: fp.write(detail_page_text)
这样就完成了!可以发现比较麻烦,还要手动去粘贴cookie,并且有的网站cookie值是有 有效期的。比较不方便,推荐使用自动方式。
再介绍自动方式
这时候引入了一个session函数,该函数可以进行请求发送,并且可以自动获取cookies。
先创建一个session对象
session=requests.Session()
然后使用携带cookies的session进行get请求的发送就行了(把requests改成session)。
但是自动方式我没跑成功,返回的界面还是登录界面....这是为啥?
3.结束语
从今天起,我要每天指定学习任务,要不然坐那半天没有纲领指导哈哈哈哈哈哈。