Python 爬虫学习

流程:
利用 requests 模块爬取数据,编写代码, 用python代码模仿浏览器去访问地址(url),用requests.text,或者response.content拿到数据...


目录:

1. requests模块的认识

2 requests发送get请求

3. requests获取响应数据

4. requests发送带headers的请求

5. requests发送带参数的请求

6. requests发送POST请求

7. requests使用代理

8. session对话

内容

一 requets 模块的认识

使用 requests 模块能够解决绝 大部分 的爬取数据的任务
就下载之后 用就完了
pycharm 安装 requests

pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

使用了加速下载 , 建议创建一个新的虚拟环境开始学习爬虫…


二 requets 发送get请求

通过requests 向百度发起请求 , 获取百度首页的数据

import requests
url = "https://www.baidu.com"
# 传入url参数
response = requests.get(url=url)
# 发送请求正常情况下 ,返回一个response对象
print("状态码:", response.status_code)
print("bytes类型数据:", response.content)
print("str类型数据:", response.text)
print("str类型数据(utf-8):", response.content.decode('utf-8'))

结果:

python爬虫模拟点击 pythone爬虫_json

其他的response 属性还有:

response.url — 请求的url

response.headers — 响应头

response.request.sponse — 响应对应的请求头

response.cookies — 响应的cookie(经过set-cookie动作)

response.request.cookies — 响应对应请求的cookie

拿到的网页的源码,因为编码的问题,汉子可能会乱码


三 requets 获取响应数据

下载图片

import requests

# 图片的url
url = 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3537849858,2288477017&fm=26&gp=0.jpg'

r = requests.get(url)
# 响应本身就是一个图片,并且是二进制类型
# print(r.content)

# 以二进制+写入的方式打开文件
with open('baidu.png', 'wb') as f:
    # r.content bytes二进制类型
    f.write(r.content)

下载html

import requests
url = 'http://news.baidu.com/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36'
}
r = requests.get(url=url, headers=headers)
# 存入一个文件里
with open('baidu_news11.html', 'w', encoding='utf-8') as f:
    # f.write(r.text)    #这两行在这里执行结果一样
    f.write(r.content.decode()) #这两行在这里执行结果一样

response.content 和 response.text 的区别

  • response.content:
    类型: bytes
    解码类型:没有指定
    修改编码方式: response.content.decode(’'utf-8")
  • response.text()
    类型: str
    解码类型:根据http头部 对响应的编码 做出推测 ,推测的文本编码
    修改编码方式: response.encoding=’'gbk"

获取json数据

import requests
import json

url = 'https://m.lagou.com/listmore.json?pageNo=4&pageSize=15'
headers = {
    "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
}
r = requests.get(url, headers=headers)

# 该地址返回的就是json格式的数据,用两种方法可以转成python字典
json_dict = json.loads(r.content)
print('loads:', json_dict)
print("_____分割_______")
print('json', r.json())

五 requets 发送带参数的请求

如果你想为请求添加 HTTP 头部,只要简单地传递一个 dictheaders 参数就可以了
为什么要加参数? — 伪装(模仿成浏览器发送请求的样子)或者有时候要cookie

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
requests.get(url, headers=headers)

可以自己尝试,带User-Agent访问百度 ,和不带这个请求百度 对比返回值(反爬)


六 requets 发送POST请求

GET,用来获取数据
POST,用来提交数据

data = {
    "keyword": "hello"
}
r = requests.post("目标URL", data=data)

如果给POST请求添加header、或者是查询字符串都是可以的,方式与GET时一样


七 使用代理

proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080",
}
requests.get("https://example.org", proxies=proxies)

当请求使用的是 http协议时 , 就用key为http对应的代理服务器转发
当---------------是 https协议时, -----------为https对应的------------------

换成真实的代理 去实践.有免费的有收费的(百度)


八 session对话

会话Session能够跨请求保持某些参数,也会在同一个 Session 实例发出的所有请求之间保持 cookie

会话保持有两个内涵:

  • 保存cookie,下一次请求会自动带上前一次的cookie
  • 实现和服务端的长连接,加快请求速度

使用方式

# 创建一个session实例对象
s = requests.Session()

# 2. 使用上一步创建的对象发起请求
r = s.get(url1, headers)

session对象在请求了一个网站后,对方服务器设置在本地的cookie会保存在session对象中,下一次再使用session对象请求对方服务器的时候,会自动带上前一次的cookie
具体说明