本篇目录
最近在学习使用python爬取网页信息,之前也写了几篇网站爬取以及图文混排爬取到word中的例子,有兴趣的可以在本站搜索python。之前大部分是不需要登录就可以访问的资源,所以使用python爬取的时候不需要登录。但是有些网站的信息(比如论坛)必须要登录用户才能访问,使用常规的python方法就无法获取到了。对于这种需要登录才能获取内容的网站,目前接触到两种方法,第一种是使用 Selenium库来调用浏览器 (chrome或firefox浏览器),模拟真实的用户操作浏览器来获取数据;另一种方法就是使用 模拟登录来获取并保存cookies,并且能实现获取目标url时携带cookies进行身份验证。本文仅介绍第二种方法,部分代码来自网络基于2.x版本修改,如果你使用的时python2.x版本可以尝试修改下再使用。
源码一、python3.7+cookiejar+urllib模拟登录人人获取cookies
#encoding=utf-8#import urllib2 #ModuleNotFoundError: No module named 'urllib2'import urllib.requestimport urllib#import cookielib #ModuleNotFoundError: No module named 'cookielib'import http.cookiejardef renrenBrower(url,user,password):#登陆页面,可以通过抓包工具分析获得,如fiddler,wireshark#login_page用户名及密码post提交的目标url,也可以用网页打开登录地址F12查看form表单的action地址,或netwrok里面查看提交地址login_page = "http://www.renren.com/PLogin.do"try:# 创建cookiejar实例对象#cookie = http.cookiejar.CookieJar()cookie = http.cookiejar.MozillaCookieJar("cookie.txt") #这个用于保存cookies#cookie = cookiejar.MozillaCookieJar() #读取cookies#cookie.load("cookie.txt")print(cookie)# <CookieJar[]># 创建管理器cookie_handler = urllib.request.HTTPCookieProcessor(cookie)http_handler = urllib.request.HTTPHandler()https_handler = urllib.request.HTTPSHandler()# 创建请求求管理器opener = urllib.request.build_opener(cookie_handler, http_handler, https_handler)#获得一个cookieJar实例#cj = cookielib.CookieJar()#cj = http.cookiejar.CookieJar()#cookieJar作为参数,获得一个opener的实例#opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))#opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))#伪装成一个正常的浏览器,避免有些web服务器拒绝访问。opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')]#生成Post数据,含有登陆用户名密码。#data = urllib.urlencode({"email":user,"password":password})#urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)data = urllib.parse.urlencode({"email":user,"password":password}).encode('utf-8') # 提交类型不能为str,需要为byte类型# email 及password 是表单的名字浏览器F12里面查看,另外有些站点需要提交csrf隐藏表单#以post的方法访问登陆页面,访问之后cookieJar会自定保存cookieopener.open(login_page,data)#以带cookie的方式访问页面op=opener.open(url)print(cookie)cookie.save()#读取页面源码data= op.read().decode("UTF-8")return dataexcept Exception as e:print(str(e))#访问某用户的个人主页,其实这已经实现了人人网的签到功能。#result = renrenBrower("http://www.renren.com/home","用户名","密码")##我们想要获取登录后的http://www.renren.com/309365594/profile?v=info_timeline页面的内容result = renrenBrower("http://www.renren.com/309365594/profile?v=info_timeline","xxxx@163.com","mima123446")print(result)
正常使用中还需进一步对返回的结果页面进行处理,这里就不介绍了,可以在本站搜索python查看之前的教程结合使用。
源码二、python3.7+requests模拟登录人人获取cookies
#encoding=utf-8import requestsdef renrenBrower(url,user,password):#登陆页面,可以通过抓包工具分析获得,如fiddler,wireshark#login_page用户名及密码post提交的目标url,也可以用网页打开登录地址F12查看form表单的action地址,或netwrok里面查看提交地址login_page = "http://www.renren.com/PLogin.do"try:# 创建Session对象# requests库的session对象会在同一个session实例的所有请求之间使用cookies保持登录状态session = requests.Session()#伪装成一个正常的浏览器,避免有些web服务器拒绝访问。headers = {'User-agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'}#headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'}#在session中发送登录请求,此后这个session里就存储了cookie#可以用print(session.cookies.get_dict())查看resp = session.post(login_page,{"email":user,"password":password})#post提交表单数据到登录地址# email 及password 是表单的名字浏览器F12里面查看,另外有些站点需要提交csrf隐藏表单resp = session.get(url,headers=headers)#携带cookies 以get方式访问目标urldata = resp.content.decode('UTF-8')print(session.cookies.get_dict())return dataexcept Exception as e:print(str(e))#访问某用户的个人主页,其实这已经实现了人人网的签到功能。#result = renrenBrower("http://www.renren.com/home","用户名","密码")#我们想要获取登录后的http://www.renren.com/309365594/profile?v=info_timeline页面的内容result = renrenBrower("http://www.renren.com/309365594/profile?v=info_timeline","xxxx@163.com","mima123446")print(result)
总体而言使用requests还是比较方便的,推荐使用这种方法!
发表评论