我保证我已经阅读了这个问题的其他版本,但我无法找到与我的情况相关的版本。如果有的话,我道歉,我现在已经盯着这几个小时了。
我已经玩弄了很多东西并且实际上在一个版本上得到了结果,所以知道它已经接近了。
' start_URLs'变量被定义为函数之前的列表,但由于某种原因,它不会在全局/模块级别上注册。
以下是确切的错误:对于start_urls中的listing_url_list: NameError:全局名称' start_urls'未定义
import time
import scrapy
from scrapy.http import Request
from scrapy.selector import Selector
from scrapy.spiders import CrawlSpider, Rule
from scraper1.items import scraper1Item
from scraper1 import csvmodule
absolute_pos = './/*[@id="xpath"]/td/@class'
class spider1(CrawlSpider):
name = 'ugh'
allowed_domains = ["ugh.com"]
start_urls = [
"http://www.website.link.1",
"http://www.website.link.2",
"http://www.website.link.3"
]
def parse(self, response):
Select = Selector(response)
listing_url_list = Select.xpath('.//*[@id="xpath"]/li/div/a/@href').extract()
for listing_url_list in start_urls:
yield scrapy.Request(listing_url, callback=self.parselisting, dont_filter=True)
def parselisting(self, response):
ResultsDict = scraper1Item()
Select = Selector(response)
ResultsDict['absolute_pos'] = Select.xpath(absolute_pos).extract()
ResultsDict['listing_url'] = response.url
return ResultsDict
答案 0 :(得分:2)
使用spider1.start_urls
而非start_urls
。
答案 1 :(得分:2)
您需要修复start_requests()
方法:
listing_url_list
代替start_urls
listing_url
代替listing_url_list
作为循环变量Selector
- 直接使用response.xpath()
shortcut 修正版:
def parse(self, response):
listing_url_list = response.xpath('.//*[@id="xpath"]/li/div/a/@href').extract()
for listing_url in listing_url_list:
yield scrapy.Request(listing_url, callback=self.parselisting, dont_filter=True)
作为旁注,我认为您不需要CrawlSpider
并且实际上可以使用常规scrapy.Spider
,因为您实际上并未将rules
与链接提取器一起使用。< / p>