scrapy中CrawlSpider类无法根据rule自动爬取

yanlafenjing2875 2016-09-09 10:22:29
之前看了网上一个爬取腾讯招聘的栗子

import re
import json
from scrapy.selector import Selector
try:
from scrapy.spider import Spider
except:
from scrapy.spider import BaseSpider as Spider
from scrapy.utils.response import get_base_url
from scrapy.utils.url import urljoin_rfc
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor as sle
from itzhaopin.items import *
from itzhaopin.misc.log import *
class TencentSpider(CrawlSpider):
name = "tencent"
allowed_domains = ["tencent.com"]
start_urls = [
"http://hr.tencent.com/position.php"
]
rules = [ # 定义爬取URL的规则
Rule(sle(allow=("/position.php\?&start=\d{,4}#a")), follow=True, callback='parse_item')
]
def parse_item(self, response): # 提取数据到Items里面,主要用到XPath和CSS选择器提取网页数据
items = []
sel = Selector(response)
base_url = get_base_url(response)
sites_even = sel.css('table.tablelist tr.even')
for site in sites_even:
item = TencentItem()
item['name'] = site.css('.l.square a').xpath('text()').extract()
relative_url = site.css('.l.square a').xpath('@href').extract()[0]
item['detailLink'] = urljoin_rfc(base_url, relative_url)
item['catalog'] = site.css('tr > td:nth-child(2)::text').extract()
item['workLocation'] = site.css('tr > td:nth-child(4)::text').extract()
item['recruitNumber'] = site.css('tr > td:nth-child(3)::text').extract()
item['publishTime'] = site.css('tr > td:nth-child(5)::text').extract()
items.append(item)
#print repr(item).decode("unicode-escape") + '\n'
sites_odd = sel.css('table.tablelist tr.odd')
for site in sites_odd:
item = TencentItem()
item['name'] = site.css('.l.square a').xpath('text()').extract()
relative_url = site.css('.l.square a').xpath('@href').extract()[0]
item['detailLink'] = urljoin_rfc(base_url, relative_url)
item['catalog'] = site.css('tr > td:nth-child(2)::text').extract()
item['workLocation'] = site.css('tr > td:nth-child(4)::text').extract()
item['recruitNumber'] = site.css('tr > td:nth-child(3)::text').extract()
item['publishTime'] = site.css('tr > td:nth-child(5)::text').extract()
items.append(item)
#print repr(item).decode("unicode-escape") + '\n'
info('parsed ' + str(response))
return items
def _process_request(self, request):
info('process ' + str(request))
return request


自己根据这个写了一个,从python的百科词条,提取页面内链接,爬取标题,简介,url

import re
from scrapy.selector import Selector
from scrapy.utils.response import get_base_url
from scrapy.spiders import Rule, CrawlSpider
from scrapy.linkextractors import LinkExtractor as sle
from baikeSpider.items import *

class BaikeSpider(CrawlSpider):
name = "baike"
allowed_domains = ["baike.baidu.com"]
start_urls = [
"http://baike.baidu.com/view/21087.htm"
]
rule = [
Rule(sle(allow=("/view/\d+\.htm")), follow=True, callback='parse_item')
]

def parse_item(self,response):
sel = Selector(response)
base_url = get_base_url(response)
item = BaikespiderItem()
item['title'] = sel.xpath('//dd[contains(@class, "lemmaWgt-lemmaTitle-title")]/h1/text()').extract()[0]
item['url'] = base_url
item['desc'] = sel.xpath('//div[contains(@class, "lemma-summary")]/div/text()').extract()
return item

def _process_request(self, request):
print('process ' + str(request))
return request

这个无法爬取,测试了一下,parse_item没有执行过,我自己把parse_item改成parse,却是能爬取start_url,很疑惑,为什么原来的不用,可以那样写,另外请教下我这个该怎么改
...全文
1315 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
大白菜好吃 2020-03-07
  • 打赏
  • 举报
回复
楼上说跟没说一样
yuzhewo 2018-01-14
  • 打赏
  • 举报
回复
引用 6 楼 Honghui_Wang 的回复:
楼主,你好,我也遇到了一样的问题,想问下你最后有找到解决方法吗
在前面我们的爬虫程序继承了CrawlSpider,还定义了parse(self, response)作为抓取到内容之后的回调函数,实际上这是错误的用法!!! 官方提示:当编写爬虫规则时,请避免使用 parse 作为回调函数。 由于 CrawlSpider 使用 parse 方法来实现其逻辑,如果 您覆盖了 parse 方法,crawl spider 将会运行失败。 所以解决方法就是删除自定义的parse,然后callback=parse_item 解析操作放到parse_item中就可以了
amberwest 2017-12-05
  • 打赏
  • 举报
回复
楼主,你好,我也遇到了一样的问题,想问下你最后有找到解决方法吗
riding 2016-11-15
  • 打赏
  • 举报
回复
scrappy 缺省调用 parse,你要用parse——item,说明你的这句话没起作用:rule = [ Rule(sle(allow=("/view/\d+\.htm")), follow=True, callback='parse_item') ] 正则表达式没有匹配view/21087.htm, 自己找正则表达式的知识补全他就可以了。
yanlafenjing2875 2016-09-15
  • 打赏
  • 举报
回复
你要是说不清我哪里说不清,那你是怎么认为我哪里说不清,spider的代码都贴全了,另外items和pipelines根本不影响爬取,除此之外你还要我贴什么???
屎克螂 2016-09-12
  • 打赏
  • 举报
回复
你还挺逗的, 我认为你没说清,我还说的清? 既然你说一个能运行成功,一个不能 那你给出这两份代码来
yanlafenjing2875 2016-09-11
  • 打赏
  • 举报
回复
唔你觉得哪里没说清,然后少了哪部分代码能说下吗
屎克螂 2016-09-11
  • 打赏
  • 举报
回复
没说清,代码也没贴全

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧