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