「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」
现代职场达人,应该做到 有情、有趣、有用、有品。好了,去掉 “有” 字你就成了。那如何成为职场幽默达人呢,咱需要一定的素材也就是段子,多看段子才能多说段子,并且还能说高级段子。
爬取前的分析工作
本次爬取的目标网站为:www.wllxy.net/gxqmlist.as…
爬取的难度整体不大,分析工作基本可以省略,毕竟对于已经学习到这里的你来说,requests
已经掌握了 7~8 成火候了。
本文重点在给你介绍一下 requests
中的代理相关内容。
爬虫基础知识普及时间
啥是代理
代理就是代理网络用户去取得网络信息。大白话就是把用户本身的 IP 和其他网络相关信息想办法隐藏起来,让目标站点获取不到。
代理的种类
高匿名代理 高匿名代理会将数据包原封不动的转发,从目标网站的服务器来看,就像是一个真实的普通用户在访问,而且使用的 IP 也是代理服务器的 IP 地址,可以完美的隐藏用户原 IP,所以高匿名代理是爬虫程序代理首选。
普通匿名代理 普通匿名代理会在数据包上做一些改动,加入 HTTP 头固定参数。正式因为固定参数的存在导致目标服务器可以追踪的用户的真实 IP,反爬度高的网站很容易判断用户是否是爬虫程序。
透明代理 这个就不用细说了,代了白代,目标服务器很容易检测出来。
在代理的种类上,有时还会按照 HTTP 和 HTTPS 区分,现在的情况下大多数网站已经升级到 HTTPS 协议了,但 HTTP 并没有被舍弃掉,一般还可以进行爬取。这里需要注意下 HTTPS 需要多次握手,速度比较慢,使用代理之后就会变的更慢,所以以后能爬 HTTP 协议的网站就尽量爬取 HTTP 协议,包括使用代理也是。
requests 使用代理
requests 支持多种代理方式,设置办法也非常简单,通过为任意请求方法提供 proxies 参数来配置单个请求,例如下述代码(关于代理本部分为大家做一下介绍即可,因为本案例实操中发现不需要代理也可以轻松完成目标数据获取)
import requests
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)
复制代码
注意代理为一个字典参数,可以包含 HTTP 或者 HTTPS 中的任意一项。
还要注意 requests 是支持 SOCKS 代理的,知识点难度的问题,不做展开讲解。
代码编写时间
代理相关的知识已经介绍完毕,下面就进入实际编码环节。
import requests
import re
import threading
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"}
flag_page = 0
# 正则表达式解析环节,最终需要将三个元组进行合并,使用 zip 函数
def anay(html):
# 正则表达式通过三次进行匹配。可以想办法提高效率,留给大家。
pattern = re.compile(
'<td class="diggtdright">[.\s]*<a href=".*?" target="_blank">\s*(.*?)</a>')
titles = pattern.findall(html)
times = re.findall('发布时间:(\d+[-]\d+[-]\d+)', html)
diggt = re.findall('得票:(\d+)人次', html)
return zip(titles, times, diggt)
def save(data):
with open("newdata.csv", "a+", encoding="utf-8-sig") as f:
f.write(f"{data[0]},{data[1]},{data[2]}\n")
def get_page():
global flag_page
while flag_page < 979:
flag_page += 1
url = f"http://www.wllxy.net/gxqmlist.aspx?p={flag_page}"
print(f"正在爬取{url}")
r = requests.get(url=url, headers=headers)
ok_data = anay(r.text)
for data in ok_data:
print(data)
# 保存到本地方法自行完成
# save(data)
if __name__ == "__main__":
for i in range(1, 6):
t = threading.Thread(target=get_page)
t.start()
复制代码
注意,zip
函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。zip 返回的是一个对象。如需展示列表,需手动 list() 转换。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。
其余内容涉及数据保存部分,即上述代码中的 save
函数,可以自行编写。
最后在啰嗦两句
本系列爬虫小课主要介绍的是 requests
库,学习完毕,你就能对 requests
库有一个比较完善的认知。