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>

+0

我只是跑你的例子,但我看不出输出文件。这就是我跑的:scrapy runspider POC.py -s DUPEFILTER_DEBUG = 1,但是在完成(ctrl + c)之前,我已经停止了它(没有任何改变)。 – mark

+0

它应该在控制台stdout中。什么是self.logger.info(self.settings [“DUPEFILTER_CLASS”])'在蜘蛛中输出? – silverfox

+0

http://i.imgur.com/6YUJS0y.png - 当我运行蜘蛛,但很快关闭到打印屏幕向你展示。控制台标准输出在哪里?你可以请改变你的代码,使输出url文件出现在脚本运行的同一目录中吗? – mark