Python网络数据采集12: 避免采集陷阱
优采云 发布时间: 2020-08-08 13:44服务器拒绝处理该表格,并且IP地址被阻止. 如何克服网站拦截自动采集的问题
12.1道德准则
为什么教集合:
12.2使网站机器人看起来像人类用户
网站反采集的先决条件是正确区分访问者和网络机器人.
修改请求标头: HTTP定义了十几种怪异的请求标头类型,但是大多数都不常用. 大多数浏览器仅使用以下七个字段来发起所有网络请求
当经典的Python采集器使用urllib标准库时,它将发送以下请求标头:
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 = "http://www.whatismybrowser.com/developers/what-http-headers-is-my-browser-sending"
req = session.get(url, headers=headers)
bsObj = BeautifulSoup(req.text)
print(bsObj.find("table",{"class":"table-striped"}).get_text)
尽管该网站可能会对HTTP请求标头的每个属性执行“人性化”检查,但我发现真正重要的参数通常是User-Agent. 将其设置为不容易引起怀疑的内容. 不要使用Python-urllib / 3.4和Accept-Language属性. 也许这是判断您为个人访问者的网站的关键.
处理cookie: 网站将使用cookie来跟踪您的访问. 如果发现异常的爬虫行为,您的访问将被中断,例如非常快速地填写表格或浏览大量页面. 尽管可以通过关闭,重新连接或更改IP地址来掩盖这些操作,但是,如果Cookie显示您的身份,则不会浪费任何精力.
某些浏览器插件可以向您显示访问和离开网站时如何设置cookie. EditThisCookie()是我最喜欢的Chrome浏览器插件之一.
from selenium import webdriver
driver = webdriver.PhantomJS(executable_path='phantomjs-2.1.1-linux-x86_64/bin/phantomjs')
driver.get("http://pythonscraping.com")
driver.implicitly_wait(1)
print(driver.get_cookies())
from selenium import webdriver
driver = webdriver.PhantomJS(executable_path='phantomjs-2.1.1-linux-x86_64/bin/phantomjs')
driver.get("http://pythonscraping.com")
driver.implicitly_wait(1)
print(driver.get_cookies())
savedCookies = driver.get_cookies()
driver2 = webdriver.PhantomJS(executable_path='phantomjs-2.1.1-linux-x86_64/bin/phantomjs')
driver2.get("http://pythonscraping.com")
driver2.delete_all_cookies()
for cookie in savedCookies:
driver2.add_cookie(cookie)
driver2.get("http://pythonscraping.com")
driver2.implicitly_wait(1)
print(driver2.get_cookies())
如果条件允许,请尝试增加每次页面访问的时间间隔time.sleep(3)12.3常见形式的安全措施
如果网络机器人在您的网站上创建了数千个帐户并开始向所有用户发送垃圾邮件,那就是个大问题.
隐式输入字段值: 在表单中,“隐藏”字段可使该字段的值对浏览器可见,但对用户不可见. 主要用于防止抓取工具自动提交表单.
第一个是字段可以由服务器生成的随机变量表示. 最好的方法是先采集随机变量,然后将其提交到表单处理页面.
第二种类型是“ honeypot”,这是一个具有通用名称的隐藏字段,该字段设置为通过CSS对用户不可见,但该漫游器会填充
避免蜜罐: 通过Selenium中的is_displayed(),您可以确定该元素在页面上是否可见.
from selenium import webdriver
from selenium.webdriver.remote.webelement import WebElement
driver = webdriver.PhantomJS(executable_path='phantomjs-2.1.1-linux-x86_64/bin/phantomjs')
driver.get("http://pythonscraping.com/pages/itsatrap.html")
links = driver.find_element_by_tag_name("a")
for link in links:
if not link.is_displayed():
print("The link "+link.get_attribute("href")+" is a trap")
fields = driver.find_element_by_tag_name("input")
for field in fields:
if not field.is_displayed():
print("Do not change value of "+field.get_attribute("name"))
12.4问题清单
如果您已被该网站阻止,但找不到原因,那么以下清单可以帮助您诊断问题.