5 个用 Python 编写非阻塞 web 爬虫的方法_python定时爬虫非阻塞(1)

大家在读 爬虫系列 的帖子时常常问我怎样写出不阻塞的爬虫,这很难,但可行。通过实现一些小策略可以让你的网页爬虫活得更久。那么今天我就将和大家讨论这方面的话题。

用户代理

你需要关心的第一件事是设置用户代理。 用户代理是用户访问的工具,并告知服务器用户正在使用哪个网络浏览器访问网站。 如果未设置用户代理,许多网站不会让你查看内容。 如果你正在使用rquests库,可以执行如下操作:

headers = {
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_11\_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
    }
r = requests.get('example.com',headers=headers)

你可以通过在 Google 搜索栏中输入 User-Agent 来获取用户代理的信息,并且它会返回你当前的用户代理信息。

现在,你已经有了一个用户代理,但如何去使用它? 那么,最好的方法是从文本文件、数据库、Python 的列表中选择一个随机的 User-Agent 。 Udger 分享了大量的 UA w.r.t 浏览器。 比如,对于 Chrome 而言,它看起来像 这样 ,对 Firefox 来说,又像 这样 。 现在让我们来创建一个函数,它将返回一个随机 UA ,你可以在请求中使用:

**import** numpy **as** np
**def** **get\_random\_ua**():
    random_ua = ''
    ua_file = 'ua\_file.txt'
    **try**:
        **with** open(ua_file) **as** f:
            lines = f.readlines()
        **if** len(lines) > 0:
            prng = np.random.RandomState()
            index = prng.permutation(len(lines) - 1)
            idx = np.asarray(index, dtype=np.integer)[0]
            random_proxy = lines[int(idx)]
    **except** Exception **as** ex:
        print('Exception in random\_ua')
        print(str(ex))
    **finally**:
        **return** random_ua

ua_file.txt 包含一个来自我上面共享的网站的每行 UA 。 函数 get_random_ua 将始终从该文件中返回唯一的 UA 。 你现在可以调用如下函数:

user_agent = get_random_ua()
headers = {
        'user-agent': user_agent,
    }
r = requests.get('example.com',headers=headers)
Referrers

接下来你需要设置的是引用。 一般的规则是,如果它是一个列表页面或主页,那么你可以设置该国家的 Google 主页网址。 例如,如果我正在爬取 olx.com.pk ,那么我会设置 https://google.com.pk 而不是 https://google.ca。

如果你要抓取各个产品页面,可以在引用中设置相关类别的网址,或者可以找到要抓取的域的反向链接 。 我通常使用 SEMRush 来这么做。针对链接 https://www.olx.com.pk/furniture-home-decor/categories/  通过 SEMRush 会返回如下所示的内容:

如果你点击查看放大的图像,你可以看到一些链接指向我所需的类别。一旦你收集所有这些真实的反向链接,你可以通过复制逻辑 insideget_random_ua()返回随机引用,并将它们用作引用。 如下所示:

headers = {
        'user-agent': user_agent,
        'referer':referer
    }
代理 IP

我不得不强调这一点。如果认真研究,那么你必须使用多个代理 IP 来避免阻塞。 大多数网站会根据你的服务器或主机提供商的静态 IP 来阻止抓取工具。 这些网站使用智能的工具来确定某个 IP 或 IP 池的方式,并简单地阻止它们。 这也是为什么建议购买几个 IP 地址,50-100个至少要避免阻塞。有许多可用的服务,但我对 Shaders(现在称为 OxyLabs )感到满意。 它们虽然很贵,但服务质量很好。 确保你在订购多个 IP 时,要求提供随机 IP 或至少不遵循 1.2.3.4 到 1.2.3.100 等特定模式。站点管理员将很简单的设置 IP 地址不全部为 1.2.3.* 。 就这么简单。

如果你正在使用请求,你可以像下面这样使用它:

r = requests.get('example.com',headers=headers,proxies={'https': proxy_url})

如果你在 Selenium 使用代理 IP ,那么这将有点棘手。

r = requests.**get**('example.com',headers=headers,proxies={'https': proxy_url})
proxy = get_random_proxy().replace('\n', '')
        service_args = [
            '--proxy={0}'.format(proxy),
            '--proxy-type=http',
            '--proxy-auth=user:path'
        ]
        print('Processing..' + url)
        driver = webdriver.PhantomJS(service_args=service_args)

不用说,get_random_proxy() 是返回一个唯一且随机代理的方法,就像上面获得唯一且随机的 UA 和 Referer 一样。

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值