我正在尝试构建一个scraper,但我一直遇到503阻塞错误。我仍然可以手动访问网站,因此我的IP地址没有被阻止。我一直在切换用户代理,仍然无法让我的代码一直运行。有时我会达到15岁,有时候我没有得到任何,但最终总是失败。我毫不怀疑我在代码中做错了什么。不过,我确实把它剃掉了,所以请记住这一点。如何在不使用第三方的情况下解决此问题?
import requests
import urllib2
from urllib2 import urlopen
import random
from contextlib import closing
from bs4 import BeautifulSoup
import ssl
import parser
import time
from time import sleep
def Parser(urls):
randomint = random.randint(0, 2)
randomtime = random.randint(5, 30)
url = "https://www.website.com"
user_agents = [
"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)",
"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)",
"Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.2.15 Version/10.00"
]
index = 0
opener = urllib2.build_opener()
req = opener.addheaders = [('User-agent', user_agents[randomint])]
def ReadUPC():
UPCList = [
'upc',
'upc2',
'upc3',
'upc4',
'etc.'
]
extracted_data = []
for i in UPCList:
urls = "https://www.website.com" + i
randomtime = random.randint(5, 30)
Soup = BeautifulSoup(urlopen(urls), "lxml")
price = Soup.find("span", { "class": "a-size-base a-color-price s-price a-text-bold"})
sleep(randomtime)
randomt = random.randint(5, 15)
print "ref url:", urls
sleep(randomt)
print "Our price:",price
sleep(randomtime)
if __name__ == "__main__":
ReadUPC()
index = index + 1
sleep(10)
554 class HTTPDefaultErrorHandler(BaseHandler):
555 def http_error_default(self, req, fp, code, msg, hdrs):
556 raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
557
558 class HTTPRedirectHandler(BaseHandler):
HTTPError: HTTP Error 503: Service Unavailable
答案 0 :(得分:0)
像使用浏览器的普通人一样行事。该网站似乎旨在分析您的行为并发现您是一名刮刀,并希望阻止您;在最简单的情况下,即时更改链接URL的最小JavaScript就足以禁用" dumb"刮削器。
有一种优雅的方法可以解决这个难题,例如通过检测浏览器,但没有外部工具就不会发生这种情况。
答案 1 :(得分:0)
你正在抓什么网站?大多数网站也使用cookie来识别用户。请在您的代码中启用Cookie。
同时在浏览器中打开该链接并与Firebug一起打开,并在发出请求时查看浏览器发送给服务器的Headers
。然后尝试伪造所有这些标题。
PS:
在我看来,从SAME IP发送随机用户代理字符串不会有任何区别,除非您正在轮换IP。