[英]ScraPy spider crawling but not exporting
我有一个在外壳程序中运行的ScraPy代码,但是当我尝试将其导出到csv时,它将返回一个空文件。 当我不进入链接并尝试解析描述时,它将导出数据,但是一旦我添加了解析内容的额外方法,它便无法工作。 这是代码:
class MonsterSpider(CrawlSpider):
name = "monster"
allowed_domains = ["jobs.monster.com"]
base_url = "http://jobs.monster.com/v-technology.aspx?"
start_urls = [
"http://jobs.monster.com/v-technology.aspx"
]
for i in range(1,5):
start_urls.append(base_url + "page=" + str(i))
rules = (Rule(SgmlLinkExtractor(allow=("jobs.monster.com",))
, callback = 'parse_items'),)
def parse_items(self, response):
sel = Selector(response)
sites = sel.xpath('//div[@class="col-xs-12"]')
#items = []
for site in sites.xpath('.//article[@class="js_result_row"]'):
item = MonsterItem()
item['title'] = site.xpath('.//span[@itemprop = "title"]/text()').extract()
item['company'] = site.xpath('.//span[@itemprop = "name"]/text()').extract()
item['city'] = site.xpath('.//span[@itemprop = "addressLocality"]/text()').extract()
item['state'] = site.xpath('.//span[@itemprop = "addressRegion"]/text()').extract()
item['link'] = site.xpath('.//a[@data-m_impr_a_placement_id= "jsr"]/@href').extract()
follow = ''.join(item["link"])
request = Request(follow, callback = self.parse_dir_contents)
request.meta["item"] = item
yield request
#items.append(item)
#return items
def parse_dir_contents(self, response):
item = response.meta["item"]
item['desc'] = site.xpath('.//div[@itemprop = "description"]/text()').extract()
return item
删除parse_dir_contents并取消注释空的“列表”列表和“追加”代码是原始代码。
好吧,正如@tayfun建议的那样,您应该使用response.xpath
或定义site
变量。
顺便说一句,您不需要使用sel = Selector(response)
。 响应是xpath
函数附带的,无需将其覆盖到另一个选择器中。
但是,主要问题是您限制了蜘蛛网的域。 您可以定义allowed_domains = ["jobs.monster.com"]
但是如果你看一下网址follow
您的自定义的Request
,你可以看到,他们是像http://jobview.monster.com/
或http://job-openings.monster.com
。 在这种情况下,不会执行parse_dir_contents
(不允许使用域),并且不会返回您的item
,因此您不会得到任何结果。
将allowed_domains = ["jobs.monster.com"]
更改为
allowed_domains = ["monster.com"]
一切都会好起来的,您的应用将可以正常工作并退货。
您的parse_dir_contents
方法中有一个错误:
def parse_dir_contents(self, response):
item = response.meta["item"]
item['desc'] = response.xpath('.//div[@itemprop=description"]/text()').extract()
return item
注意使用response
。 我不知道您当前从何处获得site
。
另外,在发布问题时,请尝试提供错误详细信息。 写“行不通”并没有多说。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.