在使用scrapy进行爬取以下网站时,常常会遇到一些情况。
例如: item中的部分内容只能通过parse()函数部分抓取,另外一部分需要设置其他的函数进行抓取,这时候就需要meta参数啦。(meta是字典类型)
meta参数在下例中的parseContent()得到继承,然后可以抓取items中得其他部分得内容了。
def parse_son(self, response):
# 类的初始化 这里下载的是除书内容外的所有内容
item = SpiderItem()
# 选择器的初始化
selector = Selector(response)
# 获取书的名字
bookName = selector.xpath('//div[@class="container"]/h1/text()').extract()
# 先抓大后抓小 这里是抓的章节的大
Chapter = selector.xpath('//div[@class="excerpts"]')
content = Chapter.xpath('.//article/a/text()').extract()
# 用每一个url作为下一个for循环的条件
url = Chapter.xpath('.//article/a/@href').extract()
# 循环提取盗墓笔记中需要的内容
for i in range(len(url)):
# 这里的try except是由于部分书籍的规则不尽相同,这里是添加了异常判断
try:
item['bookName'] = bookName[0].split(':')[0]
item['bookTitle'] = bookName[0].split(':')[1]
except Exception as e:
item['bookName'] = bookName[0]
# url的获取
item['chapterURL'] = url[i]
try:
item['chapterNum'] = content[i].split(' ')[1]
item['chapterName'] = content[i].split(' ')[2]
except Exception as e:
item['chapterNum'] = content[i].split(' ')[1]
# yield可以理解为只要扔出请求它就会有专门的下载器进行下载 参数如下 第一个url信息 第二个回调函数将要执行的地址
# self.parseContent()表示的是函数的执行 self.parseContent表示的是函数的地址
yield Request(url[i], callback=self.parseContent, meta={'item':item})
def parseContent(self, response):
# 类的初始化
item = response.meta['item']
selector = Selector(response)
text = selector.xpath('//article[@class="article-content"]/p/text()').extract()
text_new = ((''.join(text).replace('\u3000',''))).strip()
item['text'] = text_new
yield item