技术分享|5个用Python编写web爬虫的方法

2018-06-27 15:35:34

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

技术分享|5个用Python编写web爬虫的方法.jpg

1、用户代理

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

 5个用Python编写web爬虫的方法1.jpg

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

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

 5个用Python编写web爬虫的方法2.jpg

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

 5个用Python编写web爬虫的方法3.jpg

二、Referrers

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

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

 5个用Python编写web爬虫的方法4.jpg

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

5个用Python编写web爬虫的方法5.jpg

三、代理IP

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

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

 5个用Python编写web爬虫的方法6.jpg

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

 5个用Python编写web爬虫的方法7.jpg

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

你可以思考一个这样的系统,在系统中你可以设置一个IP每天或每小时访问网站频率,如果它超过了,那么它将被放入一个笼子里直到第二天。我所在的公司设计了一个这样的系统,不仅设置了IP访问频率,还记录了哪个IP被阻止。最后,我只是使用代理服务提供者仅替换这些代理。由于这超出了本文的范围,所以我不会详细介绍它。

四、Request  Headers

到目前为止,事情你都已经做得很好,但是仍然有些狡猾的网站要求你做更多的事情。当你访问页面的时候他们会查找特定的请求响应头信息,如果特定的头信息没有被发现,他们会阻止内容显示或者展示一个虚假的内容。模拟一个你想访问的网站的请求是非常简单的。例如,比如你正准备访问一个CraigslistURL,并且想知道哪个头部信息是需要的。进入Chrome/Firefox浏览器,检查正在访问的页面,你应该会看到下面这些内容:

 5个用Python编写web爬虫的方法8.jpg

如果你点击了图标并查看,你能找到除了refereruser-agent之外的大量信息。你能一次性全都实现也可以一个个的实现并测试。无论访问哪个网站,我总是去设置这些信息。请确保你不只是复制粘贴这些信息去访问所有网站,因为这些信息通常会因网站不同而改变。

 5个用Python编写web爬虫的方法9.jpg

五、延时

在请求之间放置一些延迟总是很好的。我使用numpy.random.choice()来实现这一目标,该函数将在我想延迟的服务中传递随机数列表:

 5个用Python编写web爬虫的方法10.jpg

如果你还没有使用过numpy库,你也可以使用random.choice来达到同样的目的。

Web爬虫被阻塞的不确定性永远不会变为零,但你总是可以采取一些措施来规避它。我们讨论了一些你应该以某种或其他方式在web爬虫中实现的策略。

作为一名开发人员,技术是立身的根本,是拴马桩的尊严;对于一个做教育机构,口碑如水是生命之源,是长盛不衰的根本。13年历经风雨依然昂首前行,未来的西安中软卓越同样会恪守初心,以技术立身,培养IT精英,捍卫教育本质。

本文由中软卓越(西安)汇集整理,转载请注明作者及出处。

如需学习java、UI设计、软件测试、Python、大数据、嵌入式、Linxu云计算,请点击咨询,加入我们让你的未来不再迷茫。

关于我们

“简称中软卓越”,是中软国际教育科技股份有限公司是大型IT人才培训机构,是人才战略的核心组成部分之一,承担集团发展过程中人才储备和培养的任务;专注IT培训37年,国内高端IT培训品牌,教育部指定官方IT人才培训机构。专注java培训、UI设计培训、软件测试培训、Python培训、大数据培训、嵌入式培训、Linxu云计算培训等培训课程。217家合作院校,880家合作企业,真实项目实战,素质拓展,职业规划。零首付,100%保障就业,先就业,后付款。

最牛逼的毕业学员入职名企享受高薪就业。880家合作企业,年培育学员人数逾6000人,毕业学员就职于中软国际、百度、腾讯、阿里巴巴、IBM、华为科技、中兴通讯、软通动力等知名企业。

还有什么疑问?我们全面为你解答!为您提供一对一专人服务,请点击下方咨询

  • 卓越资讯
  • 猜你想看
  • 常见问题

    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。[详细课程]

    软件开发是根据用户要求建造出软件系统或者系统中的软件部分的过程;软件开发是一项包括需求捕捉、需求分析、设计、实现和测试的系统工程。[详细课程]

    软件测试是在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。[详细课程]

    Python是一种面向对象的解释型计算机程序设计语言,语法简洁清晰,特色之一是强制用空白符作为语句缩进,它常被昵称为胶水语言,能够把用其他语言制作的各种模块。[详细课程]

    UI设计分为实体UI和虚拟UI,互联网说的UI设计是虚拟UI,一般是指对软件的人机交互、操作逻辑、界面美观的整体设计。[详细课程]

    大数据,又称巨量资料,指的是所涉及的数据资料量规模巨大到无法通过人脑甚至主流软件工具,在合理时间内达到撷取、管理、处理、并整理成为帮助企业经营决策更积极目的的资讯。[详细课程]

    云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。[详细课程]

    西安市长安北路8号高速大厦三楼

    电话:029-61876930