在python中逐行输入来自txt的变量

时间:2017-02-03 07:01:09

标签: python python-2.7 web-scraping scrapy web-crawler

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

我的txt文件如下所示:

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

我这样做:

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
    ]

但变量DOMAIN会将所有网址一次性获取,而不是单独使用。它必须整体处理一个URL,另一个操作处理第二个。

另外,这个DOMAIN变量是scrapy for crawling的补充。 代码库的一部分:

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)

单个网址的完整工作脚本---

for i in 1...255 {
    let ip = "192.168.1.\(i)"
    // Call the API with ip
}

2 个答案:

答案 0 :(得分:0)

好的,您要将要创建的域列表分配给DOMAIN。

content = DOMAIN

然后你需要连接&#39; http://&#39;对于以下每一个:

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]

然后,您有一个可用于连接的所有网址列表。我不确定你在这之后做了什么,但我认为它应该涉及迭代开始网址列表?

for url in start_url:
    scrapy.Request(url)  

希望这有帮助,

答案 1 :(得分: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']

请注意,如果它是一个非常大的文件,一次读取while文件可能会被认为是低效的。在这种情况下,您可以删除将整个文件读入列表的需要,以及逐行处理文件时的请求:

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。当然,这些是指导原则,而不是规则,但如果您遵循它们,其他人也可以更轻松地遵循您的代码。