学会这 10000 个段子,成为 IT 职场幽默达人。Python 爬虫小课 8-9

「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

现代职场达人,应该做到 有情、有趣、有用、有品。好了,去掉 “有” 字你就成了。那如何成为职场幽默达人呢,咱需要一定的素材也就是段子,多看段子才能多说段子,并且还能说高级段子。

爬取前的分析工作

本次爬取的目标网站为:www.wllxy.net/gxqmlist.as…

学会这 10000 个段子,成为 IT 职场幽默达人。Python 爬虫小课 8-9

爬取的难度整体不大,分析工作基本可以省略,毕竟对于已经学习到这里的你来说,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 库有一个比较完善的认知。

Guess you like

Origin juejin.im/post/7031393353530867726