我刚刚开始使用刮伤,我想做以下几件事
Have a list of n domains
i=0
loop for i to n
Use a (mostly) generic CrawlSpider to get all links (a href) of domain[i]
Save results as json lines要做到这一点,蜘蛛需要接收它必须作为参数爬行的域。
我已经成功地创建了CrawlSpider:
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy.item import Item, Field
from scrapy.crawler import CrawlerProcess
class MyItem(Item):
#MyItem Fields
class SubsiteSpider(CrawlSpider):
name = "subsites"
start_urls = []
allowed_domains = []
rules = (Rule(LinkExtractor(), callback='parse_obj', follow=True),)
def __init__(self, starturl, allowed, *args, **kwargs):
print(args)
self.start_urls.append(starturl)
self.allowed_domains.append(allowed)
super().__init__(**kwargs)
def parse_obj(self, response):
item = MyItem()
#fill Item Fields
return item
process = CrawlerProcess({'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'})
process.crawl(SubsiteSpider)
process.start()如果我用scrapy crawl subsites -a starturl=http://example.com -a allowed=example.com -o output.jl调用它,结果与我想要的完全一样,所以这个部分已经很好了。
我不能做的是创建多个SubsiteSpider实例,每个实例都以不同的域作为参数。
我试过(在SpiderRunner.py)
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
process = CrawlerProcess(get_project_settings())
process.crawl('subsites', ['https://example.com', 'example.com'])
process.start()变式:
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
process = CrawlerProcess(get_project_settings())
allowed = ["example.com"]
start = ["https://example.com"]
process.crawl('subsites', start, allowed)
process.start()但我认为会出现一个错误,因为参数没有正确地传递给__init__,例如TypeError: __init__() missing 1 required positional argument: 'allowed'或TypeError: __init__() missing 2 required positional arguments: 'starturl' and 'allowed' (循环尚未实现)。
因此,下面是我的问题: 1)如果我不开始通过scrapy shell而从python代码中爬行,那么向init传递参数的正确方法是什么? 2)如何也传递-o output.jl参数?(或者,使用允许的参数作为文件名?) 3)我不介意这样一个接一个地运行每个蜘蛛--这样做仍然被认为是最好的/良好的实践吗?如果有这样的教程,你能指出一个关于“使用不同参数(=目标域)一次又一次运行同一蜘蛛”的更广泛的教程吗?
非常感谢大家提前!如果有任何拼写错误(不是以英语为母语的人),或者问题/细节不够精确,请告诉我如何改正。
发布于 2018-02-26 13:53:03
您的代码有几个问题:
start_urls和allowed_domains是您在__init__()中修改的类属性,使它们在类的所有实例中共享。
您应该做的是让它们具有实例属性:
类SubsiteSpider(CrawlSpider):name = "subsites“rules =(LinkExtractor(),回调=‘parse’,follow=True),) def __init__(self,starturl,rules,*args,**kwargs):self.start_urls = starturl self.allowed_domains =self super().__init__(*args,**kwargs)CrawlProcess.crawl()的调用略有错误。您可以像这样使用它,以传递参数的方式将它们传递给蜘蛛类‘__init__()’。
process = CrawlerProcess(get_project_settings()) process.crawl(‘subsite’,'https://example.com','example.com') process.start()我还如何传递-o output.jl参数?(或者使用允许的参数作为文件名?
您可以使用custom_settings实现相同的效果,为每个实例提供不同的FEED_URI设置。
https://stackoverflow.com/questions/48982416
复制相似问题