爬虫学习笔记(第五章)requests进阶

13 篇文章 4 订阅


前言

2021.08.01弄完第五章。


第五章

1.模拟登录

  • 模拟登录:
    • 爬取基于某些用户的用户信息。

2.实战

①人人网模拟登录(src反爬待解决)

  • 需求:对人人网进行模拟登录(人人网,注册不了,可以跳了)。
    • 点击登录按钮之后会发起一个post请求;
    • post请求中会携带登录之前录入的相关的登录信息(用户名、密码、验证码等);
    • 验证码:每次请求都会变化;
  • 编码流程:
    • 1.验证码识别,获取验证码图片的文字数据
    • 2.对post请求进行发送
    • 3.对相应数据进行持久化存储

练习代码如下:
[备注:教程中目前不可使用或访问的部分已经进行了提换和修改,以下内容使用的是超级鹰进行图片识别]

# 编码流程:
#  1.验证码识别,获取验证码图片的文字数据
#  2.对post请求进行发送
#  3.对相应数据进行持久化存储

import requests
from lxml import html
etree = html.etree
from bs4 import BeautifulSoup

from CodeClass import Chaojiying_Client

# 1.对验证码图片进行捕获和识别

if __name__ == "__main__":
    url = 'https://www.renren.com/login'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
    }
    page_text = requests.get(url=url, headers=headers).text
    tree = etree.HTML(page_text)

    # 这里图片的src为         data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/.../.../.../.../.../.../.../.../.../...
    # 但是xpath解析到的数据为  data:image/jpg;base64,
    # 逗号后面的数据都没有了,不知道是什么原因,所以这里我换一种方法
    # code_img_src = tree.xpath('/html/body/div/div[3]/div/div[1]/div[2]/div[2]/div[3]/div/img/@src')[0]
    soup = BeautifulSoup(page_text, 'lxml')
    code_img_src = soup.find('div', class_='rr-login_code input')
    # 好吧,人家验证码图片的src咱爬不全,不是解析的问题
    # 以后如果能解决的话再回来改
    print(code_img_src)
    code_img_data = requests.get(url=code_img_src, headers=headers)
    with open('./code.jpg', 'wb') as fp:
        fp.write(code_img_data)

    # 使用超级鹰提供的示例代码对验证码图片进行识别
    chaojiying = Chaojiying_Client('qwq', 'qwq', 'qwq')
    im = open('code.jpg', 'rb').read()
    result = chaojiying.PostPic(im, 1902)
    print(result)

    # 以下代码正确性以及适用性未知

    login_url = ''
    data = {

    }
    response = requests.post(url=login_url, headers=headers, data=data)
    print(response.status_code)     # 如果是200,则请求成功

    # login_page_text = requests.post(url=login_url, headers=headers, data=data).text
    # with open('renren.html', 'w', encoding='utf-8') as fp:
    #     fp.write(login_page_text)

②爬取用户信息(咱没有人人网账号,代码仅供参考)

  • 需求:爬取当前用户的相关用户信息(个人主页中显示的用户信息)
import requests
from lxml import html
etree = html.etree
from bs4 import BeautifulSoup

from CodeClass import Chaojiying_Client

# 1.对验证码图片进行捕获和识别

if __name__ == "__main__":
    url = 'https://www.renren.com/login'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
    }
    page_text = requests.get(url=url, headers=headers).text
    tree = etree.HTML(page_text)

    code_img_src = tree.xpath('/html/body/div/div[3]/div/div[1]/div[2]/div[2]/div[3]/div/img/@src')[0]
    code_img_data = requests.get(url=code_img_src, headers=headers)
    with open('./code.jpg', 'wb') as fp:
        fp.write(code_img_data)

    # 使用超级鹰提供的示例代码对验证码图片进行识别
    chaojiying = Chaojiying_Client('qwq', 'qwq', 'qwq')
    im = open('code.jpg', 'rb').read()
    result = chaojiying.PostPic(im, 1902)
    print(result)


    login_url = ''
    data = {

    }
    response = requests.post(url=login_url, headers=headers, data=data)
    print(response.status_code)     # 如果是200,则请求成功

    # 爬取当前用户的个人主页对应的页面数据
    detail_url = 'http://www.renren.com/*********/profile'
    detail_page_text = requests.get(url=detail_url, headers=headers).text
    with open('detailPage.html', 'w', encoding='utf-8') as fp:
        fp.write(detail_page_text)

3.模拟登录Cookie操作

  • http/https协议特性:无状态。
  • 没有请求到对应数据的原因:
    • 发起的第二次基于个人主页页面请求的时候,服务器端并不知道该请求是基于登录状态下的请求。
  • cookie:用来让服务器端记录客户端的相关状态。
  • 处理cookie的形式:
    • 手动处理:通过抓包工具获得cookie值,将该值封装到headers中(不推荐)
      (通用性不强,处理麻烦;有的页面cookie是动态变化的,有的具有有效时长)
    • 自动处理
      • cookie值的来源是哪里?
        • 模拟登录post请求后,由服务器端创建。
      • session会话对象
        • 作用:
          • 1.可以进行请求的发送
          • 2.如果请求过程中产生了cookie,则该cookie会被自动存储/携带在该session对象中
      • 操作流程:
        • 1.创建一个session对象:session = requests.Session()
        • 2.使用session对象进行模拟登录post请求发送(cookie会被存储在session中)
        • 3.session对象对个人主页对应的get请求进行发送(携带了cookie)

爬取用户信息修改版(使用session对象):

import requests
from lxml import html
etree = html.etree
from bs4 import BeautifulSoup

from CodeClass import Chaojiying_Client

# ①创建一个session对象
session = requests.Session()

# 1.对验证码图片进行捕获和识别

if __name__ == "__main__":
    url = 'https://www.renren.com/login'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
    }
    page_text = requests.get(url=url, headers=headers).text
    tree = etree.HTML(page_text)

    code_img_src = tree.xpath('/html/body/div/div[3]/div/div[1]/div[2]/div[2]/div[3]/div/img/@src')[0]
    code_img_data = requests.get(url=code_img_src, headers=headers)
    with open('./code.jpg', 'wb') as fp:
        fp.write(code_img_data)

    # 使用超级鹰提供的示例代码对验证码图片进行识别
    chaojiying = Chaojiying_Client('qwq', 'qwq', 'qwq')
    im = open('code.jpg', 'rb').read()
    result = chaojiying.PostPic(im, 1902)
    print(result)


    login_url = ''
    data = {

    }
    # ②使用session进行请求的发送
    response = session.post(url=login_url, headers=headers, data=data)
    print(response.status_code)     # 如果是200,则请求成功

    # 爬取当前用户的个人主页对应的页面数据
    detail_url = 'http://www.renren.com/*********/profile'
    # 手动cookie处理
    # 通用性不强,处理麻烦
    # 有的页面cookie是动态变化的,有的具有有效时长

    # headers = {
    #     'Cookie': '*****'
    # }

    # ③使用携带cookie的session进行get请求的发送
    detail_page_text = session.get(url=detail_url, headers=headers).text
    with open('detailPage.html', 'w', encoding='utf-8') as fp:
        fp.write(detail_page_text)

4.代理

  • 代理:破解封IP这种反爬机制。
  • 什么是代理:
    • 代理服务器。
  • 代理的作用:
    • 突破自身IP访问的限制。
    • 隐藏自身真实的IP。
  • 代理相关的网站
    • 快代理
    • 西祠代理已经挂了qwq(下面找了一个可以用的)
    • 西拉代理(登陆之后每天可以免费获取500个网络代理网址IP。注册以后点击上方“免费API接口”,按照提示操作就能获取免费的代理IP了)
    • www.goubanjia.com(这个也挂了qwq)
  • IP查询网站:
  • 代理IP的类型:
    • http:应用到http协议对应的url中
    • https:应用到https协议对应的url中
  • 代理IP的匿名度:
    • 透明:服务器它知道该次请求使用了代理,也知道请求对应的真实IP
    • 匿名:服务器它知道该次请求使用了代理,不知道请求对应的真实IP
    • 高匿:服务器不知道该次请求使用了代理,不知道请求对应的真实IP
  • 反爬机制:封IP
  • 反反爬策略:使用代理进行请求发送

测试代码如下:

import requests

if __name__ == "__main__":
    url = 'https://www.baidu.com/s?wd=ip'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
    }

    # page_text = requests.get(url=url, headers=headers, proxies={"https": '免费的代理暂时没找到好用的,付费的还没试,使用的时候把:后面的去掉'}).text
    # page_text = requests.get(url=url, headers=headers, proxies={"https": ''}).text
    page_text = requests.get(url=url, headers=headers).text
    with open('ip.html', 'w', encoding='utf-8') as fp:
        fp.write(page_text)
# 反爬机制:封IP
# 反反爬策略:使用代理进行请求发送
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹清兰香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值