python网络爬虫 CrawlSpider使用详解
CrawlSpider
- 作用:用于进行全站数据爬取
- CrawlSpider就是Spider的一个子类
- 如何新建一个基于CrawlSpider的爬虫文件
- scrapygenspider-tcrawlxxxwww.xxx.com
- 例:choutiPro
LinkExtractor连接提取器:根据指定规则(正则)进行连接的提取
Rule规则解析器:将连接提取器提取到的连接进行请求发送,然后对获取的页面进行指定规则【callback】的解析
一个链接提取器对应唯一一个规则解析器
例:crawlspider深度(全栈)爬取【sunlinecrawl例】
分布式(通常用不到,爬取数据量级巨大、时间少时用分布式)
概念:可将一组程序执行在多态机器上(分布式机群),使其进行数据的分布爬取
原生的scrapy框架是否可以实现分布式?
不能
抽屉
#spider文件
importscrapy
fromscrapy.linkextractorsimportLinkExtractor
fromscrapy.spidersimportCrawlSpider,Rule
classChoutiSpider(CrawlSpider):
name='chouti'
#allowed_domains=['www.xxx.com']
start_urls=['https://dig.chouti.com/1']
#连接提取器:从起始url对应的页面中提取符合规则的所有连接;allow=正则表达式
#正则为空的话,提取页面中所有连接
link=LinkExtractor(allow=r'\d+')
rules=(
#规则解析器:将连接提取器提取到的连接对应的页面源码进行指定规则的解析
#Rule自动发送对应链接的请求
Rule(link,callback='parse_item',follow=True),
#follow:True将连接提取器继续作用到连接提取器提取出来的连接对应的页面源码中
)
defparse_item(self,response):
item={}
#item['domain_id']=response.xpath('//input[@id="sid"]/@value').get()
#item['name']=response.xpath('//div[@id="name"]').get()
#item['description']=response.xpath('//div[@id="description"]').get()
returnitem
阳光热线网
#1.spider文件
importscrapy
fromscrapy.linkextractorsimportLinkExtractor
fromscrapy.spidersimportCrawlSpider,Rule
fromsunLineCrawl.itemsimportSunlinecrawlItem,ContentItem
classSunSpider(CrawlSpider):
name='sun'
#allowed_domains=['www.xxx.com']
start_urls=['http://wz.sun0769.com/index.php/question/questionType?type=4&page=']
link=LinkExtractor(allow=r'type=4&page=\d+')#提取页码连接
link1=LinkExtractor(allow=r'question/2019\d+/\d+\.shtml')#提取详情页连接
rules=(
Rule(link,callback='parse_item',follow=False),
Rule(link1,callback='parse_detail'),
)
#解析出标题和网友名称数据
defparse_item(self,response):
tr_list=response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
fortrintr_list:
title=tr.xpath('./td[2]/a[2]/text()').extract_first()
net_friend=tr.xpath('./td[4]/text()').extract_first()
item=SunlinecrawlItem()
item['title']=title
item['net_friend']=net_friend
yielditem
#解析出新闻的内容
defparse_detail(self,response):
content=response.xpath('/html/body/div[9]/table[2]//tr[1]/td/div[2]//text()').extract()
content=''.join(content)
item=ContentItem()
item['content']=content
yielditem
--------------------------------------------------------------------------------
#2.items文件
importscrapy
classSunlinecrawlItem(scrapy.Item):
title=scrapy.Field()
net_friend=scrapy.Field()
classContentItem(scrapy.Item):
content=scrapy.Field()
--------------------------------------------------------------------------------
#3.pipelines文件
classSunlinecrawlPipeline(object):
defprocess_item(self,item,spider):
#确定接受到的item是什么类型(Content/Sunlinecrawl)
ifitem.__class__.__name__=='SunlinecrawlItem':
print(item['title'],item['net_friend'])
else:
print(item['content'])
returnitem
--------------------------------------------------------------------------------
#4.setting文件
BOT_NAME='sunLineCrawl'
SPIDER_MODULES=['sunLineCrawl.spiders']
NEWSPIDER_MODULE='sunLineCrawl.spiders'
LOG_LEVEL='ERROR'
USER_AGENT='Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/76.0.3809.132Safari/537.36'
ROBOTSTXT_OBEY=False
ITEM_PIPELINES={
'sunLineCrawl.pipelines.SunlinecrawlPipeline':300,
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。