适用网站及场景
抓取需要登录才能访问的页面:有的网站你得登进去才能看到页面,直接访问网页地址会给你跳转到登录页面
cookie和session机制
Http协议为无连接协议
cookie存放在客户端浏览器,session存放在web服务器
方法一:requests.get()中参数headers参数中携带你的cookie
- 先登录成功1次,获取到携带登录信息的cookie:登录成功–个人主页–F12抓包–刷新个人主页抓包–一般会在前几个包中有你的cookie信息
- 携带着cookie发请求
抓取人人网资源示例
import requests
from lxml import etree #用于解析html
class RenRenLogin(objects):
def __init__(self):
self.url = 'http://www.renren.com/xxxxxx/profile' #你自己登上去的人人网个人主页
self.headers = {
'Cookie':'xxxx', #你登陆后自己的cookie
'User-Agent':xxx #自己选一个User-Agent
}
#发起请求并解析
def parse_html(self):
html = requets.get(url=self.url, #请求的网页url
headers=self.headers).text #requests模块的text属性获取响应内容
p = etree.HTML(html) #创建解析对象
#xpath表达式(随便找个你想抓下来的节点内容,我们的目的是测试cookie)
xpath_bds = '/html/body/div[3]/div/div[5]/div[2]/div[1]/div/div[2]/div[4]/div[1]/div[1]/div/div/div[1]/article/section/div/form/div/dl/dd[3]/a/text()'
#解析对象调用xpath解析
r_list = p.xpath(xpath_bds)
print(r_list)
#入口函数
def run(self):
self.parse_html()
if __name__ == '__main__':
spider = RenRenLogin()
spider.run()
方法二:requests.get()中使用cookies参数(需要将cookies处理成字典)
- 拿到cookie字符串
- 将cookie转成字典
- 发requests.get()请求时发携带cookies
import requests
from lxml import etree #用于解析html
class RenRenLogin(objects):
def __init__(self):
self.url = 'http://www.renren.com/xxxxxx/profile' #你自己登上去的人人网个人主页
self.headers = {
#第一种方法这样写:'Cookie':'xxxx', #你登陆后自己的cookie
'User-Agent':xxx #自己选一个User-Agent
}
#将你拿到的cookies整理成字典形式
def get_cookies(self):
#手动登录页面后去拿你的cookies
cook_str = 'xxx' #你拿到的cookie是{xxx=xxx;xxx=xxx;...}格式
#将你拿到的cookies处理成字典
cookies = {}
#将cook_str处理成['xxx=xxx','xxx=xxx'...]
cook_lsit = cook_str.split(';')
#再处理成字典的形式{xxx:xxx,xxx:xxx/...}
for cook in cook_list:
key = cook.split('=')[0]
val = cook.split('=')[1]
#创建新的键值对
cookies[key] = val
return cookies
def parse_html(self):
#将拿到的cookies字符串处理成字典
cookies = self.get_cookies()
html = requests.get(
url=self.url,
headers=self.headers,
cookies=cookies
).text
#以下开始解析并输出,和前面的代码步骤一样,不再赘述
方法三:requests模块提供了session类(和网站的session不是一个东西),来实现客户端和服务端的会话保持
详细流程
- 寻找登录时的Form表单提交信息的目标地址:action=‘xxx’(查看网页中form元素节点,拿到action='xxx’这个地址)
- 实例化session对象:session = requests.session()
- 发送用户名和信息到POST的地址
- 用户名和密码是以字典发送的,键为标签中name的值(email,password),值为真实的用户名和密码:post_data = {‘email’:‘xx’,‘password’:‘xx’}
- 登录网站:session对象发送请求,登录对应网站,把cookie保存在session对象:session.post()
- 访问页面抓取数资源:session对象请求需要登录才能访问的页面,session能够自动携带之前的这个cookie,进行请求
import requests
class RenRenLogin:
def __init__(self):
#登录页面
self.post_url = 'http://www.renren.com/PLogin.do'
#个人主页的url地址
self.get_url = 'http://www.renren.com/xxxxxx/profile'
self.headers = {'User-Agent':'xx'}
#实例化session对象
self.session = requests.sesison()
#解析过程
def parse_html(self):
#1.先登录
#键:email和password为form标签中的 <input>标签的name
#值:为你真实的账号和密码
data = {'email':'','password':''}
#使用session对象发登录请求
self.session.post(url=self.post_url,data=data,headers=self.headers}
#2. 再抓取
html = self.session.get(url=self.get_url).text
print(html)
def run(self):
self.parse_html()
if __name__ == '__main__':
spider = RenRenLogin()
spider.run()