在Scrapy框架中使用Tor

7 投票
1 回答
7628 浏览
提问于 2025-04-17 06:03

我正在尝试抓取一个网站,这个网站对机器人有一些防护措施,也就是说它只允许少量的请求,之后Scrapy就会卡住。

问题1:有没有办法让Scrapy在卡住时,从同一个地方重新开始抓取?为了避免这个问题,我把我的设置文件写成了这样:

BOT_NAME = 'MOZILLA'
BOT_VERSION = '7.0'

SPIDER_MODULES = ['yp.spiders']
NEWSPIDER_MODULE = 'yp.spiders'
DEFAULT_ITEM_CLASS = 'yp.items.YpItem'
USER_AGENT = '%s/%s' % (BOT_NAME, BOT_VERSION)

DOWNLOAD_DELAY = 0.25
DUPEFILTER=True
COOKIES_ENABLED=False
RANDOMIZE_DOWNLOAD_DELAY=True
SCHEDULER_ORDER='BFO'

这是我的程序:

class ypSpider(CrawlSpider):

   name = "yp"


   start_urls = [
       SOME URL

   ]
   rules=(
      #These are some rules
   )
   def parse_item(self, response):
   ####################################################################
   #cleaning the html page by removing scripts html tags    
   #######################################################
   hxs=HtmlXPathSelector(response)

我的问题是,我应该在哪里写HTTP代理?我是否需要导入与Tor相关的类?我对Scrapy还不太熟悉,感谢这个小组让我学到了很多,现在我正在尝试学习“如何使用IP轮换或Tor”。

根据我们一位成员的建议,我启动了Tor,并把HTTP_PROXY设置为:

set http_proxy=http://localhost:8118

但它出现了一些错误,

failure with no frames>: class 'twisted.internet.error.ConnectionRefusedError'   Connection was refused by other side 10061: No connection could be made because the target machine actively refused it.

所以我把http_proxy改成了:

set http_proxy=http://localhost:9051

现在错误是:

failure with no frames>: class 'twisted.internet.error.ConnectionDone' connection was closed cleanly.

我检查了Firefox的网络设置,那里没有看到任何HTTP代理,而是使用了SOCKSV5,显示的是127.0.0.1:9051。(在使用Tor之前,它是可以正常工作的,没有代理)请帮帮我,我还是不明白如何通过Scrapy使用Tor。我应该使用哪个Tor包,怎么用?

我希望我的两个问题都能得到解决:

  1. 如果Scrapy爬虫因为某种原因(比如连接失败)卡住了,我希望能从那里继续服务。
  2. 如何在Scrapy中使用轮换IP。

1 个回答

4

TOR本身并不是一个http代理,端口8118和连接被拒绝的错误说明你可能没有正确运行privoxy[1]。试着正确设置privoxy,然后再使用环境变量http_proxy=http://localhost:8118进行尝试。

我已经成功地通过privoxy和scrapy在TOR上进行爬虫操作。

[1] http://www.privoxy.org/

撰写回答