2017-02-03 61 views
0

我有一个变量DOMAIN,它将url作为输入。我想从txt文件中逐一提供URL列表。在python中将输入从txt逐行输入到变量中

我的txt文件看起来是这样的:

www.yahoo.com 
www.google.com 
www.bing.com 

我这样做:

with open('list.txt') as f: 
    content = f.readlines() 
content = [x.strip() for x in content] 
DOMAIN = content 

但可变域采取的所有URL一次,而不是分开。它必须整个处理一个URL,并在另一个操作中处理第二个URL。

请注意,此DOMAIN变量是供scrapy进行爬网的。代码库的一部分 :

from scrapy.selector import HtmlXPathSelector 
from scrapy.spider import BaseSpider 
from scrapy.http import Request 
with open('list.txt') as f: 
    content = f.readlines() 
# you may also want to remove whitespace characters like `\n` at the end of each line 
content = [x.strip() for x in content] 
DOMAIN = content 
URL = 'http://%s' % DOMAIN 

class MySpider(BaseSpider): 
    name = DOMAIN 
    allowed_domains = [DOMAIN] 
    start_urls = [ 
     URL 
    ] 

错误:

对于单个URL
scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET http://['www.google.com', 'www.yahoo.com', 'www.bing.com']> 
executing as scrapy runspider spider.py 

完全工作脚本---

from scrapy.selector import HtmlXPathSelector 
from scrapy.spider import BaseSpider 
from scrapy.http import Request 

DOMAIN = 'google.com' 
URL = 'http://%s' % DOMAIN 

class MySpider(BaseSpider): 
    name = DOMAIN 
    allowed_domains = [DOMAIN] 
    start_urls = [ 
     URL 
    ] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     for url in hxs.select('//a/@href').extract(): 
      if not (url.startswith('http://') or url.startswith('https://')): 
       url= URL + url 
      print url 
      yield Request(url, callback=self.parse) 

回答

0

好了,你要分配要创建域列表到DOMAIN。

content = DOMAIN 

然后你需要连接的“http://”每个这些:

with open('list.txt') as f: 
    content = f.readlines() 
content = [x.strip() for x in content] 
domain_list = content 
web = 'http://' 
start_url = [web + s for s in domain_list] 

然后你把所有的清单您的网址,你可以用它来连接。在此之后,我不确定你在做什么,但我认为它应该包括迭代启动URL列表?

for url in start_url: 
    scrapy.Request(url) 

希望这有助于

+0

我实际上正在收到错误,,要说清楚,iam正在上传总体脚本 – user7423959

0

有了这些行:

DOMAIN = content 
URL = 'http://%s' % DOMAIN 

你可以做DOMAIN点你刚才从您的文件创建的列表,然后再连接http://和字符串表示的名单,所以你得到这个:

`http://['www.google.com','www.yahoo.com', 'www.bing.com']' 

因此你的错误。你需要给'http://'串联到列表中的每个条目 - 你可以简单地做到这一点,而你直接在列表理解遍历文件,而不是使用readlines()读取文件:

with open('list.txt','r') as f: 
    url_list = ['http://'+line.strip() for line in f] 

这将产生一个列出那么你就可以scrapy遍历:

['http://www.google.com','http://www.yahoo.com', 'http://www.bing.com'] 

注意,在一次读取文件的同时,可以考虑低效率的,如果它是一个非常大的文件。在这种情况下,你可以删除需要读取整个文件到列表中,只是请求你处理的文件中的行由行:

with open('list.txt','r') as f: 
    for line in f: 
     url = 'http://'+line 
     request = scrapy.http.Request(url) 
     # Do something with request here 

另外请注意,你不应该使用所有大写字母用于变量名称,这些通常只用于常量。有关命名约定的更多指导,请参阅PEP8 - The Python Style Guidelines。当然这些是指导原则,而不是规则,但如果你遵循这些原则,以后会让其他人更容易遵循你的代码。

+0

我实际上正在收到错误,为了说清楚,iam正在上传整个脚本 – user7423959