我在Windows Vista 64位上使用Python.org版本2.7 64位。我有一些递归的webscraping代码,在我正在查看的网站上被反抓取措施捕获:
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector
from scrapy.item import Item
from scrapy.spider import BaseSpider
from scrapy import log
from scrapy.cmdline import execute
from scrapy.utils.markup import remove_tags
import time
class ExampleSpider(CrawlSpider):
name = "goal3"
allowed_domains = ["whoscored.com"]
start_urls = ["http://www.whoscored.com/"]
rules = [Rule(SgmlLinkExtractor(allow=()),
follow=True),
Rule(SgmlLinkExtractor(allow=()), callback='parse_item')
]
def parse_item(self,response):
self.log('A response from %s just arrived!' % response.url)
scripts = response.selector.xpath("normalize-space(//title)")
for scripts in scripts:
body = response.xpath('//p').extract()
body2 = "".join(body)
print remove_tags(body2).encode('utf-8')
time.sleep(5)
execute(['scrapy','crawl','goal3'])
为了阻止这种情况发生,我尝试添加一个基本的' time.sleep()'用于减慢提交提交的速度。但是,当通过命令提示符运行代码时,此功能似乎没有任何影响。代码继续以相同的速度运行,因此所有请求都以HTTP 403的形式返回。
有人能看出为什么这可能不起作用吗?
由于
答案 0 :(得分:2)
不要重新发明轮子。您正在寻找DOWNLOAD_DELAY
设置:
下载者之前应该等待的时间(以秒为单位) 从同一网站下载连续页面。这可以使用 限制爬行速度以避免过于严重地击中服务器。
还有其他技术,如轮换用户代理,IP地址,请参阅Avoid Getting Banned部分。
另外,请确保您知道网站的Terms of Use
是什么。确保他们不反对网络抓取以及网站是否提供API。