Python:使用Scrapy脚本 - 这是从论坛中刮去网址的最佳方式吗?
问题描述:
我想做的事:Python:使用Scrapy脚本 - 这是从论坛中刮去网址的最佳方式吗?
- 刮都来自这个网站的网址:http://www.captainluffy.net/ (我的朋友的网站,我是谁有权刮去网址)
- 但是,我不能就这么野蛮的一切,因为我最终会有很多重复的链接(98%是重复的)
- 即使我使我的日志文件只包含独特的URL,它仍然可能是几百万的链接(这将需要相当一段时间才能获得)。
我可以暂停/我的斗志脚本由于恢复到这一点: http://doc.scrapy.org/en/latest/topics/jobs.html
所以它拆分每100个万名记录我已经设定的脚本。
Python字典只检查每个文本文件中重复项的url密钥。因此,至少每个文件中的网址都是唯一的。如果我有更大的字典。这会极大地拖慢国际海事组织的进程。有1个重复(每1,000,000个日志)胜过数千。
这是Python脚本代码我目前使用:
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor
from scrapy.item import Item, Field
class MyItem(Item):
\t url=Field()
f=open("items0"+".txt","w")
num=open("number.txt","w")
class someSpider(CrawlSpider):
name = "My script"
domain=raw_input("Enter the domain:\n")
allowed_domains = [domain]
starting_url=raw_input("Enter the starting url with protocol:\n")
start_urls = [starting_url]
i=0
j=0
dic={}
global f
rules = (Rule(LxmlLinkExtractor(allow_domains=(domain)), callback='parse_obj', follow=True),)
def parse_obj(self,response):
for link in LxmlLinkExtractor(allow_domains=(self.domain)).extract_links(response):
item = MyItem()
item['url'] = link.url
if self.dic.has_key(item['url']):
continue
global f
global num
f.write(item['url']+"\n")
self.dic[item['url']]=True
self.i+=1
if self.i%1000000==0:
self.j+=1
f.close()
f=open("items"+str(self.j)+".txt","w")
num.write(str(self.j+1)+"\n")
是否有人有更好的方法来凑?
你估计我的scrapy脚本会从这样的网站上获取多少个日志文件?
答
Scrapy拖放重复请求DUPEFILTER_CLASS,默认设置为RFPDupeFilter,与您的方法类似,但不能保存可见的URL到很多文件。
我已经创建了一个POC。
# -*- coding: utf-8 -*-
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor
class ExampleSpider(CrawlSpider):
name = "ExampleSpider"
allowed_domains = ["www.example.com", "www.iana.org"]
start_urls = (
'http://www.example.com/',
)
rules = (Rule(LxmlLinkExtractor(allow_domains=allowed_domains), callback='parse_obj', follow=True),)
log_file = open('test.log', 'a')
def parse_obj(self, response):
#self.logger.info(response.url)
self.logger.info(self.settings['DUPEFILTER_CLASS'])
self.log_file.write(response.url + '\n')
运行它与scrapy crawl ExampleSpider -s DUPEFILTER_DEBUG=1
,应该有一些调试信息如下。
[scrapy] DEBUG:过滤重复的请求:< GET http://www.iana.org/about/framework>
我只是跑你的例子,但我看不出输出文件。这就是我跑的:scrapy runspider POC.py -s DUPEFILTER_DEBUG = 1,但是在完成(ctrl + c)之前,我已经停止了它(没有任何改变)。 – mark
它应该在控制台stdout中。什么是self.logger.info(self.settings [“DUPEFILTER_CLASS”])'在蜘蛛中输出? – silverfox
http://i.imgur.com/6YUJS0y.png - 当我运行蜘蛛,但很快关闭到打印屏幕向你展示。控制台标准输出在哪里?你可以请改变你的代码,使输出url文件出现在脚本运行的同一目录中吗? – mark