DAY02
一. 批量下载图片
import requests
import json
for i in range(1, 10):
URL = 'https://api.ixiaowai.cn/api/api.php?return=json'
resp = requests.get(url=URL)
resp.encoding = 'utf-8-sig'
# print(resp.text)
# 序列化
data = json.loads(resp.text)
# print(data)
# 每次循环(更新)此链接中的图片都会改变
resp_1 = requests.get(url=data['imgurl'])
# print(resp_1.content)
# 'wb':写的数据类型是二进制
with open(f'imgs/{i}.jpg', 'wb') as f:
f.write(resp_1.content)
二. 正则表达式匹配页面内容
"""
<li><div class="dd_lm">[<a href=/society.shtml>社会</a>]
</div> <div class="dd_bt"><a href="/sh/2022/05-10/9750566.shtml">
一人阳性整栋楼都要集中隔离?上海疾控释疑密接、次密接判断标准</a></div>
<div class="dd_time">5-10 10:29</div></li>
"""
li_re = '<li><div class="dd_lm">\[<a href=.*\.shtml>([\u4e00-\u9fa5]{2})' \
'</a>\]</div> <div class="dd_bt"><a href="(.*\.shtml)">(.*)</a></div>' \
'<div class="dd_time">(\d{1,2}-\d{1,2} \d\d:\d\d)</div></li>'
result1 = re.findall(li_re, resp.text)
PS:从json接口获取的数据需要序列化将json数据(str)转化为python数据(dict),网页爬取数据类型为字符串类型
URL = 'https://api.ixiaowai.cn/api/api.php?return=json'
resp = requests.get(url=URL)
print(type(resp.text)) # <class 'str'>
data = json.loads(resp.text)
print(type(data)) # <class 'dict'>
三. 豆瓣电影爬虫
# 正则表达式匹配电影名和链接
# .*? 表示换行,并用 flags=re.S 单行匹配,解决网页源代码中换行的问题
href_re = '<div class="hd">.*?<a href="(.*?)" class="">.*?<span class="title">(.*?)</span>'
# re.S --> 单行匹配
result = re.findall(href_re, response1.text, flags=re.S)
四. 进度条
# tqdm:三方的进度条模块
from tqdm import tqdm
# 有进度条不能有print、有print不能有进度条
# tqdm()操作对象:可迭代对象。
for i in tqdm(range(1, 100000001), desc='进度条........'):
pass
五. 代理IP使用
- 客户端和服务器之间通过网络进行通信。为什么客户端能够正确的找到服务器、服务器也能够正确的找到客户端,涉及到网络中的IP地址。在同一个网络下IP地址是唯一的。
- 代理ip等于客户端和目标服务器之间的中间商。
我们通过中间商访问目标服务器,等于我们将需求告诉中间商,中间商根据需求访问目标服务器,目标服务器的响应结果再一层一层的返回给我们。 - 代理IP池:包含了N个代理ip。
- 常见的代理IP提供商:极光爬虫代理、芝麻代理、蘑菇代理、西刺代理等。
import requests
import json
# 请求API接口获取代理ip
# 1.从代理IP提供商得到的json接口
API_url = 'http://d.jghttp.alicloudecs.com/getip?num=10&type=2&pro=&city=0&yys=0&port=1&time=4&ts=0&ys=0&cs=0&lb=1&sb=0&pb=45&mr=1®ions='
# 2.对保存了代理IP的json数据序列化
ip_data_list = json.loads(resp.text)['data']
# 3.拼接成 IP地址:端口号
ip_port_list = [f'{i["ip"]}:{i["port"]}' for i in ip_data_list]
print(ip_port_list)
# 4.构造代理ip需要的字典
proxy = {
# 表示将一个代理ip拼接上它应该走的协议
'http': f'http://{ip_port_list[0]}',
'https': f'http://{ip_port_list[0]}'
}
Headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
}
resp = requests.get(url=API_url, headers=Headers)
print(resp.text)
URL = 'https://movie.douban.com/top250?start=0&filter='
# 5.添加代理IP参数
resp = requests.get(url=URL, headers=Headers, proxies=proxy)
if resp.status_code == 200:
print(resp.text)
else:
print(resp.status_code)
.get(url=URL, headers=Headers, proxies=proxy)
if resp.status_code == 200:
print(resp.text)
else:
print(resp.status_code)