Requests爬虫方法

发布于:2022-12-21 ⋅ 阅读:(504) ⋅ 点赞:(0)

目录

一、Requests 简介

 1.1、requests是什么

 1.2、安装

 1.3、response的属性及类型

二、requests使用

 2.1、requests 的 get 请求

 2.2、requests 的 post 请求

 2.3、request 代理

 2.4、cookie登录

  2.4.1、难点:

  2.4.2、解决

  2.4.3、代码


一、Requests 简介

 1.1、requests是什么

        requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多

 1.2、安装

 1.3、response的属性及类型

类型 models.Response
response.text 获取网站源码
response.encoding 访问或定制编码方式
response.url 获取请求的url
response.content 响应的字节类型
response.status_code 响应的状态码
response.headers 响应的头信息
import requests

url = 'https://www.baidu.com'

response = requests.get(url=url)

# 一个类型和六个属性
print(type(response))

# 设置响应的编码格式
response.encoding = 'utf8'

# 以字符串的形式返回网页源码
print(response.text)

# 返回一个url地址
print(response.url)

# 返回二进制的数据
print(response.content)

# 返回响应的状态码
print(response.status_code)

# 返回响应头信息
print(response.headers)

二、requests使用

 2.1、requests 的 get 请求

     (1)参数使用params传递
     (2)参数无需urlencode编码
     (3)不需要请求对象的定制
     (4)请求资源路径中的?可加可不加

import requests

url = 'http://www.baidu.com/s?'

# 反反爬手段,向请求中加入headers
headers = {
    'Cookie': '',
    'User-Agent': '',
}

data = {
    'wd': '北京'
}

# url:请求资源路径
# params:参数
# kwargs:字典
response = requests.get(url=url, params=data, headers=headers)

content = response.text

print(content)

 2.2、requests 的 post 请求

        (1)post 请求,不需要编解码

        (2)post 请求的参数是 data

        (3)不需要请求对象的定制

import requests
import json

url = 'https://fanyi.baidu.com/sug'

# 反反爬手段,向请求中加入headers
headers = {
    'User-Agent': '',
}

data = {
    'kw': 'eye'
}

# url:请求资源路径
# data:请求参数
# kwargs:字典
response = requests.post(url=url, data=data, headers=headers)
content = response.text

obj = json.loads(content, encoding='utf-8')

print(obj)

 2.3、request 代理

 用快代理获取ip:快代理 - 企业级HTTP代理IP云服务

import requests

url = 'http://www.baidu.com/s?'

# 反反爬手段,向请求中加入headers
headers = {
    'User-Agent': '',
}

data = {
    'wd': 'ip'
}

proxy = {
    'http': 'ip:端口号'
}

response = requests.get(url=url, params=data, headers=headers, proxies=proxy)

content = response.text

with open('daili.html', 'w', encoding='utf8') as fp:
    fp.write(content)

 2.4、cookie登录

  2.4.1、难点:

   1、登陆参数获取:

        对于下列参数,__VIEWSTATE和__VIEWSTATEGENERATOR的值的获取

# 通过找登录接口,发现登陆参数有很多
# __VIEWSTATE: yBR7i/CfOluitzhWj0BEY3LZQ4IALwhDwIaRLd3rhTSdj7NIIqmnF8TcTn8RvDNnG0fM6kvPDW7DA5KCdOgE0Ls2CKxJbZFTBduqurV/NvQIa2IwZmc1PrKPyHmI5gno8pkx8YE1WTtcrRsol9c3EQS0ZmA=
# __VIEWSTATEGENERATOR: C93BE1AE
# from: http://so.gushiwen.cn/user/collect.aspx
# email: 
# pwd: 
# code: 7DFJ
# denglu: 登录

    2、验证码的获取:验证码在随时变动,且通过图片告知登陆者

  2.4.2、解决

    1、登陆参数:一般在页面源码中存在参数,大多存在隐藏域中

    2、验证码:通过requests的session()方法获取并利用session发起验证码输入请求。

   2.4.3、代码

import requests
from bs4 import BeautifulSoup

# 登陆页面的url地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'

headers = {
    'User-Agent': '',
}

# 获取页面的源码
response = requests.get(url=url, headers=headers)
content = response.text

# 解析页面源码,获取__VIEWSTATE和__VIEWSTATEGENERATOR
soup = BeautifulSoup(content, 'lxml')
# 获取__VIEWSTATE
viewstate = soup.select('#__VIEWSTATE')[0].attrs.get('value')
# 获取__VIEWSTATEGENERATOR
viewstategenerator = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
print(viewstate)
print(viewstategenerator)

# 获取验证码图片
code = soup.select('#imgCode')[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn' + code

# 有坑(此时获取的验证码和提交请求时的验证码不一样)
# import urllib.request
# urllib.request.urlretrieve(url=code_url, filename='code.jpg')

# requests中有一个session方法,通过session的返回值,就能使请求变成一个对象
session = requests.session()
# 验证码的url内容
response_code = session.get(code_url)

#注意:此时要使用二进制数据 因为要使用的是图片的下载
content_code = response_code.content
#wb模式,将二进制数据写入到文件
with open('code.jpg', 'wb') as fp:
    fp.write(content_code)

# 获取验证码的图片后,下载到本地,然后在控制台输入验证码,之后就可以登陆
code_name = input('请输入验证码')

# 点击登录
url_post = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
data_post = {
    '__VIEWSTATE': viewstate,
    '__VIEWSTATEGENERATOR': viewstategenerator,
    'from': 'http://so.gushiwen.cn/user/collect.aspx',
    'email': '',
    'pwd': '',
    'code': code_name,
    'denglu': '登录'
}

response_post = session.post(url=url, headers=headers, data=data_post)
content_post = response_post.text

with open('gushici.html', 'w', encoding='utf8') as fp:
    fp.write(content_post)

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到