在Scrapy中为start_urls逐个读取文本文件的链接

时间:2017-06-29 13:07:29

标签: python scrapy scrapy-spider

links.txt

www.link.com/1 | linkname1
www.link.com/2 | linkname2
www.link.com/3 | linkname3

我的目标是为 start_urls 变量设置“ www.link.com/1 ”链接,为 linkname1 ” >名称变量。然后我的其他代码能够从链接“www.link.com/1”中删除数据。那么它应该处理另一行“ www.link.com/2 | linkname2 ”。我想继续这样的数千行的过程。 我的代码只适用于一行。它不适用于下一行。所以我的问题是我如何遍历文本文件中的所有行。

我的Scrapy代码:

f = open('links.txt', 'r')
listoflinks = [line.strip().split(' | ') for line in f.readlines()]
for pair in listoflinks:
    start_url = [pair[0]]
    name = pair[1]
f.close()

class LinkSpider(scrapy.Spider):

    allowed_domains = ["link.com"]
    start_urls = start_url;

到目前为止我可以试试这个。此代码仅处理一行。我需要为成千上万的线做。任何建议/提示都会非常有用。

2 个答案:

答案 0 :(得分:2)

scrapy.Spider.__init__同时接受namestart_url

class LinkSpider(scrapy.Spider):
    allowed_domains = ["link.com"]

with open('links.txt', 'r') as links:
    for link in links:
        url, name = link.strip().split('|')
        spider = LinkSpider(name, start_urls=[url.strip()])
        print 'name: {}, start urls: {}'.format(spider.name, spider.start_urls)

输出继电器:

name:  linkname1, start urls: ['www.link.com/1']
name:  linkname2, start urls: ['www.link.com/2']
name:  linkname3, start urls: ['www.link.com/3']

答案 1 :(得分:1)

您循环遍历文本文件的行并提取变量start_urlname,这可以正常工作。但是使用这些变量的代码部分不在循环中。

另外我假设你想为每一行创建一个LinkSpider实例?然后你需要做这样的事情(甚至更好的是编写一个将两个变量作为参数的构造函数):

class LinkSpider(scrapy.Spider):
    name = "link"
    allowed_domains = ["link.com"]
    start_urls = None

f = open('links.txt', 'r')
listoflinks = [line.strip().split(' | ') for line in f.readlines()]
for pair in listoflinks:
    start_url = [pair[0]]
    name = pair[1]

    ls = LinkSpider()
    ls.name = name
    ls.start_urls = start_url

    # do something with ls...

f.close()

一个小小的旁注,而不是:

for pair in listoflinks:
    start_url = [pair[0]]
    name = pair[1]
    ...

你可以写:

for start_url, name in listoflinks:
    ...