CrawpSpider和Spider的区别
CrawlSpider使用基于规则的方式来定义如何跟踪链接和提取数据。它支持定义规则来自动跟踪链接,并可以根据链接的特征来确定如何爬取和提取数据。CrawlSpider可以对多个页面进行同样的操作,所以可以爬取全站的数据。CrawlSpider可以使用LinkExtractor用正则表达式自动提取链接,而不需要手动编写链接提取代码。
Spider和CrawlSpider都是Scrapy的Spider类的子类。
注意:CrawlSpider是不支持请求传参的!(多个parse函数的参数之间的来回传递)
CrawlSpider使用步骤
- 创建一个工程 XXXPro scrapy startproject XXXPro
- cd XXXPro
- 创建爬虫文件(CrawlSpider):scrapy genspider -t crawl xxx www.xxxx.com
- 链接提取器LinkExtractor:根据指定的规则(allow)(正则表达式)进行指定链接的提取
- 规则解析器Rule:将链接提取器提取到的链接进行指定规则(callback)的解析
爬取全页的链接
我们可以根据每页的链接形式,使用正则表达式来进行提取。
通过使用下面的链接提取器,可以得到所有页面的链接,而且虽然提取到的链接是不全的,CrawlSpider还会自动补全。
link = LinkExtractor(allow=r"/content/node_21745_") # 这个链接提取器是用于在页面源码中根据制定规则进行正则匹配的
爬取每个新闻详情页的url
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))
parse解析函数
# 解析新闻标题
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
pipelines管道类
class SunproPipeline:
def process_item(self, item, spider):
if item.__class__.__name__ == 'SunproItem':
print(item['title'])
else:
print(item['content'])
return item
注意要在setings.py中开启管道类