我正在处理Scrapy,Privoxy和Tor。我已全部安装并正常工作。但是Tor每次都使用相同的IP连接,因此我很容易被禁止。是否可以告诉Tor每X秒或连接重新连接一次?
谢谢!
编辑有关配置:对于用户代理程序池,我这样做:http :
//tangww.com/2013/06/UsingRandomAgent/ (我不得不放入_ init
_.py文件,如注释中所述),并且对于Privoxy和Tor,我遵循http://www.andrewwatters.com/privoxy/(我必须使用终端手动创建私有用户和私有组)。有效
:)
我的蜘蛛是这样的:
from scrapy.contrib.spiders import CrawlSpider
from scrapy.selector import Selector
from scrapy.http import Request
class YourCrawler(CrawlSpider):
name = "spider_name"
start_urls = [
'https://example.com/listviews/titles.php',
]
allowed_domains = ["example.com"]
def parse(self, response):
# go to the urls in the list
s = Selector(response)
page_list_urls = s.xpath('///*[@id="tab7"]/article/header/h2/a/@href').extract()
for url in page_list_urls:
yield Request(response.urljoin(url), callback=self.parse_following_urls, dont_filter=True)
# Return back and go to bext page in div#paginat ul li.next a::attr(href) and begin again
next_page = response.css('ul.pagin li.presente ~ li a::attr(href)').extract_first()
if next_page is not None:
next_page = response.urljoin(next_page)
yield Request(next_page, callback=self.parse)
# For the urls in the list, go inside, and in div#main, take the div.ficha > div.caracteristicas > ul > li
def parse_following_urls(self, response):
#Parsing rules go here
for each_book in response.css('main#main'):
yield {
'editor': each_book.css('header.datos1 > ul > li > h5 > a::text').extract(),
}
在settings.py中,我有一个用户代理轮换和privoxy:
DOWNLOADER_MIDDLEWARES = {
#user agent
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware' : None,
'spider_name.comm.rotate_useragent.RotateUserAgentMiddleware' :400,
#privoxy
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
'spider_name.middlewares.ProxyMiddleware': 100
}
在middlewares.py中,我添加了:
class ProxyMiddleware(object):
def process_request(self, request, spider):
request.meta['proxy'] = 'http://127.0.0.1:8118'
spider.log('Proxy : %s' % request.meta['proxy'])
我认为就这些…
编辑II-
好的,我更改了middlewares.py文件,就像博客@TomášLinhart所说的那样:
class ProxyMiddleware(object):
def process_request(self, request, spider):
request.meta['proxy'] = 'http://127.0.0.1:8118'
spider.log('Proxy : %s' % request.meta['proxy'])
至
from stem import Signal
from stem.control import Controller
class ProxyMiddleware(object):
def process_request(self, request, spider):
request.meta['proxy'] = 'http://127.0.0.1:8118'
spider.log('Proxy : %s' % request.meta['proxy'])
def set_new_ip():
with Controller.from_port(port=9051) as controller:
controller.authenticate(password='tor_password')
controller.signal(Signal.NEWNYM)
但是现在真的很慢,并且似乎没有更改ip…我做的还好还是有问题?
这篇博客文章可能会帮助您,因为它处理了相同的问题。
编辑: 基于具体要求(对于每个请求或之后新的IP Ñ
请求),把适当的呼叫到set_new_ip
在process_request
中间件的方法。但是请注意,对set_new_ip
函数的调用并不一定总是确保新的IP(存在指向FAQ的链接以及相关说明)。
EDIT2: 具有ProxyMiddleware
类的模块如下所示:
from stem import Signal
from stem.control import Controller
def _set_new_ip():
with Controller.from_port(port=9051) as controller:
controller.authenticate(password='tor_password')
controller.signal(Signal.NEWNYM)
class ProxyMiddleware(object):
def process_request(self, request, spider):
_set_new_ip()
request.meta['proxy'] = 'http://127.0.0.1:8118'
spider.log('Proxy : %s' % request.meta['proxy'])
问题内容: 我正在尝试运行具有两个“扩展名”的Scrapy蜘蛛: 启动以渲染JavaScript, Tor-Privoxy提供匿名性。 例如,我在https://github.com/scrapy-plugins/scrapy- splash/tree/master/example中 使用的刮板。这是我的目录结构: 其中目录是从克隆库。我添加了以下文件: 我在文件中更改的位置: 因为Splash不
是是候去解决我们在上一章所制造的Bug了:) view是存放应用逻辑的地方。 它将从你之前创建的 模型中获取数据,并将它传递给 模板。 我们将在下一章创建 tempalte 模板。 视图就是Python方法,只不过比我们在Python简介章节中所做的事情稍复杂。 视图都被置放在views.py文件中。我们将加入我们自己的views到blog/views.py文件。 blog/views.py 好,
问题内容: 我有以下脚本: 使用tor和SocksiPy 现在,我想更改每个请求的tor身份,例如: 我怎样才能做到这一点? 问题答案: 今天,我对这个问题进行了很多搜索,最后设法回答了自己。但是在我不得不说pirvoxy和tor应该正确配置之前。第一个脚本,然后是一些配置: 上面的脚本获取了新的IP并从ifconfig.me网站进行了检查。关于配置:我们需要Privoxy。要将TOR与HTTP连
问题内容: 匹配条件后,如何在一段时间后更新表? 我需要在满足某些条件后进行更新,并在2天后根据收到的最新答案(即e)进行更新,因此应在上进行更新。 问题答案: 试试这个 如此看来,这两个表是由相连的,并且具有的最新回答日期。通过使用我们可以知道今天的日期和比赛的答案之间的差异。
问题内容: 在页面的页脚中,我想添加诸如“最后更新xx / xx / 200x”之类的内容,该日期为最后一次更新某些mySQL表的时间。 最好的方法是什么?有检索上次更新日期的功能吗?每次需要此值时都应该访问数据库吗? 问题答案: 在更高版本的MySQL中,您可以使用数据库来告诉您何时更新了另一个表: 当然,这确实意味着要打开与数据库的连接。 另一种选择是每当更新MySQL表时“触摸”特定文件:
Updated可以让您在记录插入或每次记录更新时自动更新数据库中的标记字段为当前时间,需要在xorm标记中使用updated标记,如下所示进行标记,对应的字段可以为time.Time或者自定义的time.Time或者int,int64等int类型。 type User struct { Id int64 Name string UpdatedAt time.Time