避开抓取陷阱的目的是克服网站阻止自动抓取这个障碍

优采云 发布时间: 2021-07-03 19:37

  避开抓取陷阱的目的是克服网站阻止自动抓取这个障碍

  避免爬虫陷阱的目的是克服网站防止自动爬虫。

  1.道德标准

  注意:此处演示的许多程序和技术不应用于任何网站。这不仅很糟糕,而且您还可能会收到一封警告信,要求您停止,甚至可能会发生更糟糕的事情。

  2.让网络机器人看起来像人类用户

  网站反爬虫的前提是正确区分人类用户和网络机器人。有很多方法可以让您的网络机器人看起来更像人类用户。

  (1)Modify 请求头

  HTTP 请求头是每次向 Web 服务器发送请求时传递的一组属性或配置信息。 HTTP 请求有多种类型。大多数浏览器仅使用这 7 个字段来初始化所有网络请求:Host、Connection、Accept、User-Agent、Referrer、Accept-Encoding、Accept-Language。经典的 Python 爬虫在使用 urllib 标准库时会发送 Accept-Encoding 和 User-Agent。

  可以使用 Requests 库配置请求标头。

  书中代码:(执行被拦截,如果执行成功:程序输出中的请求头应该和程序中设置的头一致。)

  import requests

from bs4 import BeautifulSoup

session = requests.Session()

headers = {'User-Agent':'Mozilla/5.0(Macintosh; Intel Mac OS X 10_9_5)AppleWebKit 537.36 (KHTML, like Gecko) Chrome', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}

url = 'https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending'

req = session.get(url, headers=headers)

bs = BeautifulSoup(req.text, 'html.parser')

print(bs.find('table', {'class':'table-striped'}).get_text)

  也许网站会检查HTTP请求头的每一个属性,通常真正重要的参数是User-Agent。不管你在做什么项目,一定要记得把User-Agent属性设置成不容易引起怀疑的东西,不要使用Python-urllib/3.4。对于非常警觉的网站,注意那些经常使用但很少检查的请求头,比如Accept-Language属性。

  很多大的网站会为相同的内容提供不同的语言翻译,根据请求头的参数响应不同的语言版本。有时只需要将请求头属性从 Accept-Language:en-US 修改为 Accept-Language:fr 即可获得法语版本的页面。请求头也可以让网站改变内容的布局风格,修改User-Agent。

  (2)使用JavaScript处理cookies

  通过正确处理 cookie,可以避免许多抓取问题。 网站 将使用 cookie 来跟踪您的访问。如果发现有异常行为的爬虫,其访问将被中断,例如非常快速地填写表格,或浏览大量页面。

  有些网站 不需要您每次登录时都获取新的 cookie。您可以通过保存旧的“登录”cookie 来访问 网站。

  某些浏览器插件可以显示您访问网站 和浏览网站 时cookie 是如何设置的。 (EditThisCookie)

  Requests模块对cookies的处理请参考第十章文章5th小节内容。

  请求库无法执行 JavaScript,因此无法处理现代跟踪软件(例如 Google Analytics)生成的许多 cookie。 cookie 仅在客户端脚本执行时设置(或根据用户浏览页面时按钮点击等 Web 事件生成 cookie)。需要用到Selenium和PhantomJS包(安装和使用在第11章文章)

  使用任意网站调用webdriver的get_cookie()方法查看cookies(cookie列表):

  from selenium import webdriver

driver = webdriver.PhantomJS(executable_path='D:/Web_crawler/phantomjs-2.1.1-windows/bin/phantomjs.exe')

driver.get('http://pythonscraping.com')

driver.implicitly_wait(1)

print(driver.get_cookies())

  

  您还可以调用 delete_cookie()、add_cookie() 和 delete_all_cookies() 方法来处理 cookie。此外,可以保存 cookie 以供其他网络爬虫使用。 (driver2的cookies打印失败,找不到原因)

  # -*- coding:GBK -*-

from selenium import webdriver

#driver = webdriver.Chrome(r'C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chromedriver.exe')

# 尝试webdriver.PhantomJS()内添加service_args=['--ignore-ssl-errors=true', '--ssl-protocol=TLSv1'],扔执行失败

driver = webdriver.PhantomJS(executable_path='D:/Web_crawler/phantomjs-2.1.1-windows/bin/phantomjs.exe')

driver.get('http://pythonscraping.com')

driver.implicitly_wait(1)

savedCookies = driver.get_cookies()

print(savedCookies)

#driver2 = webdriver.Chrome(r'C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chromedriver.exe')

driver2 = webdriver.PhantomJS(executable_path='D:/Web_crawler/phantomjs-2.1.1-windows/bin/phantomjs.exe')

driver2.get('http://pythonscraping.com')

driver2.delete_all_cookies()

for cookie in savedCookies:

if not cookie['domain'].startswith('.'):

cookie['domain'] = '.{}'.format(cookie['domain']) #PhantomJS的规则——添加cookie的所有域名都要以.字符开头

driver2.add_cookie(cookie)

driver2.get('http://pythonscraping.com')

driver.implicitly_wait(1)

print(driver2.get_cookies())

  (3)时间就是一切

  一些具有完整保护措施的网站可能会阻止您快速提交表单或与网站快速交互。以比普通人快得多的速度从网站下载大量信息,也可能导致自己被网站屏蔽。

  多线程程序可能是快速加载页面的好方法,但这对于编写良好的爬虫来说仍然是一个糟糕的策略。应该尽量确保页面加载和数据请求最小化。如果可能,尝试在页面访问之间添加几秒钟(使用以下代码)。有时候,我们必须学会撤退!

  import time

time.sleep(3)

  3.通用表单安全措施

  Web 表单,尤其是用于创建和登录帐户的表单,如果被机器人滥用,将对网站 的安全性和计算开销构成严重威胁。因此,试图限制网站 的访问是最适合许多网站 所有者的利益。 (有关处理受保护表单的更多信息,请参阅第 13 部分和第 17 部分)

  (1)隐式输入字段值

  在HTML表单中,“隐藏”字段用于使该字段的值对浏览器可见,但对用户不可见(除非你看到

  网页源代码)。

  有两种主要方法可以阻止带有隐藏字段的网络爬行:

  第一个是表单页面上的一个字段可以填充由服务器生成的随机变量。 (规避这个问题最好的办法是先抓取表单所在页面生成的随机变量,然后提交到表单处理页面。)

  第二种方法是“蜜罐”。服务器会忽略所有隐藏字段的真实值(或表单提交页面上与默认值不同的值),填写隐藏字段的用户甚至可能被网站屏蔽。总之,有时候需要检查一下表单所在的页面,看看有没有服务器预设的隐藏字段(蜜罐陷阱)缺失或者错误。此外,还有其他检查可以用来确保当前生成的表单变量只使用过一次或最近生成过(这可以防止变量简单地存储在程序中重复使用)。

  (2)避免蜜罐

  如果web表单的某个字段通过CSS设置为用户不可见,那么普通用户在访问网站时无法填写该字段。如果填写了这个字段,很可能是机器人做了,所以这个提交会作废。这种方法也适用于链接、图片、文件以及任何机器人可以读取但普通用户在浏览器中看不到的内容。

  查看网站的源码,通过CSS隐藏了一个链接(属性设置display:none)和两个隐藏字段(type="hidden",元素移动到了显示和滚动的边界之外bar 被隐藏,导致元素不可见)。

  Selenium 可以获取访问页面的内容,因此可以区分页面上的可见元素和隐藏元素。使用 is_displayed() 判断该元素在页面上是否可见。

  以下代码查找上面网站的隐藏元素:

  from selenium import webdriver

from selenium.webdriver.remote.webelement import WebElement

driver = webdriver.PhantomJS(executable_path='D:/Web_crawler/phantomjs-2.1.1-windows/bin/phantomjs.exe')

driver.get('http://pythonscraping.com/pages/itsatrap.html')

links = driver.find_elements_by_tag_name('a')

for link in links:

if not link.is_displayed():

print('The link {} is a trap'.format(link.get_attribute('href')))

fields = driver.find_elements_by_tag_name('input')

for field in fields:

if not field.is_displayed():

print('Do not change value of {}'.format(field.get_attribute('name')))

  

  简而言之,简单地忽略隐藏字段是危险的,但在与它们交互时必须小心。

  4.问题清单

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线