我对Java的编程经验很少。
我正在尝试进入python并且在理解我正在尝试设置的scrapy网络爬虫时遇到问题。
该脚本将从网站上抓取产品等并将它们放入文件中,并递归遍历网站内的所有登陆域,但停在指定的深度。
我无法理解如何将脚本中传出的URL传递给我发现的scrapy示例。
执行我的蜘蛛的代码:
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})
process.crawl(UrlScrappyRunner, domain="www.google.com")
process.start()
我的蜘蛛:
class UrlScrappyRunner(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)
请您告诉我如何将domain = www.google.com传递给我的蜘蛛,以便抓取谷歌而不是quotes.toscrape.com?
答案 0 :(得分:1)
您可以在scrapy中使用argumets -a
来传递用户定义的值
class UrlScrappyRunner(scrapy.Spider):
name = "quotes"
def __init__(self, domain=None, *args, **kwargs):
self.domain = domain
def start_requests(self):
urls = self.domain
以参数
运行scrapy crawl UrlScrappyRunner -a domain="www.google.com"
从流程运行:
process.crawl(UrlScrappyRunner, domain="www.google.com")
在您的代码中添加__init__
并在您的类变量中分配域值
答案 1 :(得分:0)
这是如何将url作为参数传递给Scrapy 1.4.0上的CrawlerProcess蜘蛛:
<强> main.py 强>
from scrapy.crawler import CrawlerProcess
from myspider import MySpider
if __name__ == '__main__':
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'FEED_URI': destination_file_uri # URI to destination file
})
process.crawl(MySpider, myurls=[
'http://example.com'
])
其中destination_file_uri类似于&#34; file:///path/to/results.json"。
<强> myspider.py 强>
import scrapy
from scrapy.http.request import Request
class MySpider(scrapy.Spider):
name = 'myspider'
def __init__(self, *args, **kwargs):
self.myurls = kwargs.get('myurls', [])
super(MySpider, self).__init__(*args, **kwargs)
def start_requests(self):
for url in self.myurls:
yield Request(url, self.parse)
def parse(self, response):
""" Test: extract quotes """
for quote in response.xpath('//blockquote').extract():
yield {"quote": quote}
其中 myurls 是一个尚未使用的属性名称(您可以更改它)。