CrawlSpider使用基于规则的方式来定义如何跟踪链接和提取数据。它支持定义规则来自动跟踪链接,并可以根据链接的特征来确定如何爬取和提取数据。CrawlSpider可以对多个页面进行同样的操作,所以可以爬取全站的数据。CrawlSpider可以使用LinkExtractor用正则表达式自动提取链接,而不需要手动编写链接提取代码。
Spider和CrawlSpider都是Scrapy的Spider类的子类。
注意:CrawlSpider是不支持请求传参的!(多个parse函数的参数之间的来回传递)
我们可以根据每页的链接形式,使用正则表达式来进行提取。
通过使用下面的链接提取器,可以得到所有页面的链接,而且虽然提取到的链接是不全的,CrawlSpider还会自动补全。
link = LinkExtractor(allow=r"/content/node_21745_") # 这个链接提取器是用于在页面源码中根据制定规则进行正则匹配的
link_detail = LinkExtractor(allow=r"/content/20")
rules = (Rule(link, callback="parse_item", follow=False), # #follow=True:可以将链接提取器 继续作用到 连接提取器提取到的链接 所对应的页面中
Rule(link_detail, callback="parse_detail", follow=False))
# 解析新闻标题
def parse_item(self, response):
# 注意:xpath表达式中不可以出现tbody标签
a_list = response.xpath('/html/body/section[2]/div[3]/div[2]/div[1]/div[4]/ul/a')
# print(li_list)
for a in a_list:
title = a.xpath('./li/p/text()').extract_first()
item = SunproItem()
item['title'] = title
# print(" title:", title)
yield item
print(len(a_list))
# 解析新闻内容
def parse_detail(self, response):
# print("parse_detail正在执行")
content = response.xpath('//*[@id="news_con"]//text()').extract()
content = ''.join(content)
item = DetailItem()
item['content'] = content
# print("news content:", content)
yield item
class SunproPipeline:
def process_item(self, item, spider):
if item.__class__.__name__ == 'SunproItem':
print(item['title'])
else:
print(item['content'])
return item
注意要在setings.py中开启管道类