1 python scrapy python-2.7 scrapy-spider
我想将scrapy作为python脚本运行,但我不知道如何正确设置设置或如何提供它们。我不确定这是否是设置问题,但我认为是。
我的配置:
我接受了https://doc.scrapy.org/en/latest/topics/practices.html#run-scrapy-from-a-script的建议来让它运行。我对以下建议有一些问题:
如果您在 Scrapy 项目中,则可以使用一些额外的帮助程序将这些组件导入项目中。您可以自动导入将其名称传递给 CrawlerProcess 的蜘蛛,并使用 get_project_settings 获取带有项目设置的 Settings 实例。
那么“在 Scrapy 项目中”是什么意思?当然,我必须导入库并安装依赖项,但我想避免使用scrapy crawl xyz.
这是 myScrapy.py 的代码
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.item import Item, Field
import os, argparse
#Initialization of directories
projectDir = os.path.dirname(os.path.realpath('__file__'))
generalOutputDir = os.path.join(projectDir, 'output')
parser = argparse.ArgumentParser()
parser.add_argument("url", help="The url which you want to scan", type=str)
args = parser.parse_args()
urlToScan = args.url
#Stripping of given URL to get only the host + TLD
if "https" in urlToScan:
urlToScanNoProt = urlToScan.replace("https://","")
print "used protocol: https"
if "http" in urlToScan:
urlToScanNoProt = urlToScan.replace("http://","")
print "used protocol: http"
class myItem(Item):
url = Field()
class mySpider(CrawlSpider):
name = "linkspider"
allowed_domains = [urlToScanNoProt]
start_urls = [urlToScan,]
rules = (Rule(LinkExtractor(), callback='parse_url', follow=True), )
def generateDirs(self):
if not os.path.exists(generalOutputDir):
os.makedirs(generalOutputDir)
specificOutputDir = os.path.join(generalOutputDir, urlToScanNoProt)
if not os.path.exists(specificOutputDir):
os.makedirs(specificOutputDir)
return specificOutputDir
def parse_url(self, response):
for link in LinkExtractor().extract_links(response):
item = myItem()
item['url'] = response.url
specificOutputDir = self.generateDirs()
filename = os.path.join(specificOutputDir, response.url.split("/")[-2] + ".html")
with open(filename, "wb") as f:
f.write(response.body)
return CrawlSpider.parse(self, response)
return item
process = CrawlerProcess(get_project_settings())
process.crawl(mySpider)
process.start() # the script will block here until the crawling is finished
Run Code Online (Sandbox Code Playgroud)
为什么我必须打电话process.crawl(mySpider)而不是process.crawl(linkspider)?我认为获取设置是一个问题,因为它们是在“正常”scrapy 项目(您必须运行的地方scrapy crawl xyz)中设置的,因为输入说
2016-11-18 10:38:42 [scrapy] INFO: Overridden settings: {}
我希望您理解我的问题(英语不是我的母语。 .. ;)) 提前致谢!
使用脚本(而不是scrapy crawl)运行爬网时,选项之一确实是使用CrawlerProcess.
那么“在 Scrapy 项目中”是什么意思?
这意味着,如果您在使用 创建的scrapy 项目的根目录运行您的脚本scrapy startproject,即您拥有scrapy.cfg包含该[settings]部分的文件的位置。
为什么我必须调用 process.crawl(mySpider) 而不是 process.crawl(linkspider)?
阅读有关scrapy.crawler.CrawlerProcess.crawl()详细信息的文档:
参数:
crawler_or_spidercls (Crawler instance, Spider subclass or string) – 已经创建的爬虫,或者项目里面的蜘蛛类或者蜘蛛的名字来创建它
我不知道框架的那部分,但我怀疑只有一个蜘蛛名称 - 我相信你的意思而不是process.crawl("linkspider"),并且在一个scrapy项目之外,scrapy不知道在哪里寻找蜘蛛(它没有提示) . 因此,要告诉scrapy 运行哪个蜘蛛,还不如直接给出类(而不是蜘蛛类的实例)。
get_project_settings()是一个帮助程序,但本质上CrawlerProcess需要使用Settings对象进行初始化(请参阅https://docs.scrapy.org/en/latest/topics/api.html#scrapy.crawler.CrawlerProcess)
事实上,它也接受一个设置dict(在内部转换为一个Settings实例),如您链接到的示例所示:
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})
Run Code Online (Sandbox Code Playgroud)
因此,根据与scrapy默认值相比,您需要覆盖哪些设置,您需要执行以下操作:
process = CrawlerProcess({
'SOME_SETTING_KEY': somevalue,
'SOME_OTHERSETTING_KEY': someothervalue,
...
})
process.crawl(mySpider)
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1801 次 |
| 最近记录: |