我已经在我的服务器上安装了
Tor + Privoxy
并且它们工作正常! (已测试)。
但现在当我尝试使用
urllib2 (python)
抓取谷歌购物结果时,当然使用代理,我总是被谷歌阻止(有时是 503 错误,有时是 403 错误)。那么任何人有任何解决方案可以帮助我避免这个问题吗?非常感谢!!
我正在使用的源代码:
_HEADERS = {
'User-Agent': 'Mozilla/5.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding': 'deflate',
'Connection': 'close',
'DNT': '1'
}
request = urllib2.Request("https://www.google.com/#q=iphone+5&tbm=shop", headers=self._HEADERS)
proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
try:
response = urllib2.urlopen(request)
html = response.read()
print html
except urllib2.HTTPError as e:
print e.code
print e.reason
注意:当我不使用代理时,它可以正常工作!
遇到的问题是 Google 会积极阻止似乎来自 Tor 出口节点的请求。这是因为他们希望防止抓取并滥用其搜索结果,并且 Tor 通常用于隐藏用户的身份和位置。
以下是一些避免在使用 Tor 和 Privoxy 抓取 Google 购物结果时被阻止的提示:
1. 轮换的 IP 地址:
-
使用 Tor 的内置功能来更改的 IP 地址。
Tor 提供了更改电路的功能,这将为提供一个新的 IP 地址。可以使用
tor
命令行工具或 Stem(一个用于控制 Tor 的 Python 库)来执行此操作。 ```python from stem import Signal from stem.control import Controller
with Controller.from_port(9051) as controller: controller.authenticate() controller.signal(Signal.NEWNYM) ``` * 使用住宅代理。 与数据中心 IP 相比,住宅代理提供真实住宅用户的 IP 地址,使其更难以被检测到和阻止。可以找到提供轮换 IP 的住宅代理服务。
2. 模拟真实用户的行为:
- 降低抓取速度。 快速连续发出多个请求是是机器人的一个明显信号。在请求之间设置随机延迟以模拟人类行为。 ```python import time import random
time.sleep(random.uniform(2, 5)) # 延迟 2 到 5 秒 ``` * 使用不同的搜索词。 不要总是使用相同的查询。尝试改变的搜索词,使用不同的过滤器和排序选项。 * 设置随机化的用户代理。 定期更改的用户代理字符串,以模仿不同的浏览器和操作系统。可以找到可用于 Python 的用户代理字符串列表。 * 使用 Headless 浏览器。 像 PhantomJS 或 Headless Chrome 这样的 Headless 浏览器可以执行 JavaScript 并渲染网站,使其看起来更像真实用户的请求。
3. 考虑替代解决方案:
- 使用 Google Shopping API。 如果需要定期抓取大量数据,Google Shopping API 是一个更可靠和可扩展的解决方案。但是,它确实需要一个 API 密钥并且有使用限制。
- 使用专门的抓取服务。 有许多第三方服务专门用于抓取网站,包括 Google 购物。这些服务通常处理 IP 轮换、验证码和反抓取措施。
代码改进:
的代码看起来不错,但可以通过添加随机用户代理轮换和请求之间的随机延迟来改进它。
import urllib2
import time
import random
_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding': 'deflate',
'Connection': 'close',
'DNT': '1'
}
def random_user_agent():
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
]
return {'User-Agent': random.choice(user_agents)}
def get_html(url):
time.sleep(random.uniform(2, 5))
request = urllib2.Request(url, headers=random_user_agent())
proxy_support = urllib2.ProxyHandler({"http": "127.0.0.1:8118"})
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
try:
response = urllib2.urlopen(request)
return response.read()
except urllib2.HTTPError as e:
print(e.code)
print(e.reason)
return None
if __name__ == '__main__':
html = get_html("https://www.google.com/#q=iphone+5&tbm=shop")
if html:
print(html)
请记住: 抓取网站的服务条款可能各不相同。在抓取任何网站之前,请务必查看其 robots.txt 文件和服务条款,以确保没有违反任何规则。
标签:python,web-scraping,tor From: 19464427