大家在读爬虫系列的帖子时常常问我怎样写出不阻塞的爬虫,这很难,但可行。通过实现一些小策略可以让你的网页爬虫活得更久。
用户代理
用户代理是用户访问的工具,并告知服务器用户正在使用哪个网络浏览器访问网站。如果你正在使用 rquests 库,可以执行如下操作:
你可以通过在 Google 搜索栏中输入 User-Agent 来获取用户代理的信息,并且它会返回你当前的用户代理信息。
Udger 分享了大量的 UA w.r.t 浏览器。比如,对于 Chrome 而言,它看起来像这样,对 Firefox 来说,又像这样。 现在让我们来创建一个函数,它将返回一个随机 UA ,你可以在请求中使用:
Referrers
你需要设置的是引用,如果它是一个列表页面或主页,那么你可以设置该国家的 Google 主页网址。 例如,如果我正在爬取 olx.com.pk ,那么我会设置 https://google.com.pk 而不是 https://google.ca。
如果你要抓取各个产品页面,可以在引用中设置相关类别的网址,或者可以找到要抓取的域的反向链接。针对链接 https://www.olx.com.pk/furniture-home-decor/categories/ 通过 SEMRush 会返回如下所示的内容:
代理 IP
如果认真研究,那么你必须使用多个代理 IP 来避免阻塞。 大多数网站会根据你的服务器或主机提供商的静态 IP 来阻止抓取工具。 这些网站使用智能的工具来确定某个 IP 或 IP 池的方式,并简单地阻止它们。 这也是为什么建议购买几个 IP 地址,50-100个至少要避免阻塞。有许多可用的服务,但我对 Shaders(现在称为 OxyLabs )感到满意。 它们虽然很贵,但服务质量很好。 确保你在订购多个 IP 时,要求提供随机 IP 或至少不遵循 1.2.3.4 到 1.2.3.100 等特定模式。站点管理员将很简单的设置 IP 地址不全部为 1.2.3.* 。 就这么简单。
如果你正在使用请求,你可以像下面这样使用它:
如果你在 Selenium 使用代理 IP ,那么这将有点棘手。
不用说,get_random_proxy() 是返回一个唯一且随机代理的方法,就像上面获得唯一且随机的 UA 和 Referer 一样。
你可以思考一个这样的系统,在系统中你可以设置一个 IP 每天或每小时访问网站频率,如果它超过了,那么它将被放入一个笼子里直到第二天。
Request Headers
模拟一个你想访问的网站的请求是非常简单的。例如,比如你正准备访问一个 Craigslist URL ,并且想知道哪个头部信息是需要的。进入 Chrome/Firefox 浏览器,检查正在访问的页面,你应该会看到下面这些内容:
如果你点击了图标并查看,你能找到除了 referer 和 user-agent 之外的大量信息。无论访问哪个网站,我总是去设置这些信息。请确保你不只是复制粘贴这些信息去访问所有网站,因为这些信息通常会因网站不同而改变。
延时
如果你还没有使用过 numpy 库,你也可以使用 random.choice 来达到同样的目的。
如果你真的很急,那么你可以并行执行 URL。
翻译:oschina 英文: ADNAN
https://www.oschina.net/translate/write-web-scrapers-in-python
喜欢
分享
or
领取专属 10元无门槛券
私享最新 技术干货