python网络爬虫 CrawlSpider使用详解
作者:陪伴is最长情的告白 发布时间:2023-03-19 21:12:56
标签:python,网络,爬虫,crawlspider
CrawlSpider
作用:用于进行全站数据爬取
CrawlSpider就是Spider的一个子类
如何新建一个基于CrawlSpider的爬虫文件
scrapy genspider -t crawl xxx www.xxx.com
例:choutiPro
LinkExtractor连接提取器:根据指定规则(正则)进行连接的提取
Rule规则解析器:将连接提取器提取到的连接进行请求发送,然后对获取的页面进行指定规则【callback】的解析
一个链接提取器对应唯一一个规则解析器
例:crawlspider深度(全栈)爬取【sunlinecrawl例】
分布式(通常用不到,爬取数据量级巨大、时间少时用分布式)
概念:可将一组程序执行在多态机器上(分布式机群),使其进行数据的分布爬取
原生的scrapy框架是否可以实现分布式?
不能
抽屉
# spider文件
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class ChoutiSpider(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 将连接提取器 继续 作用到 连接提取器提取出来的连接 对应的页面源码中
)
def parse_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()
return item
阳光热线网
# 1.spider文件
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from sunLineCrawl.items import SunlinecrawlItem,ContentItem
class SunSpider(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'),
)
# 解析出标题和网友名称数据
def parse_item(self, response):
tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
for tr in tr_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
yield item
# 解析出新闻的内容
def parse_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
yield item
--------------------------------------------------------------------------------
# 2.items文件
import scrapy
class SunlinecrawlItem(scrapy.Item):
title = scrapy.Field()
net_friend = scrapy.Field()
class ContentItem(scrapy.Item):
content = scrapy.Field()
--------------------------------------------------------------------------------
# 3.pipelines文件
class SunlinecrawlPipeline(object):
def process_item(self, item, spider):
# 确定接受到的item是什么类型(Content/Sunlinecrawl)
if item.__class__.__name__ == 'SunlinecrawlItem':
print(item['title'],item['net_friend'])
else:
print(item['content'])
return item
--------------------------------------------------------------------------------
# 4.setting文件
BOT_NAME = 'sunLineCrawl'
SPIDER_MODULES = ['sunLineCrawl.spiders']
NEWSPIDER_MODULE = 'sunLineCrawl.spiders'
LOG_LEVEL = 'ERROR'
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {
'sunLineCrawl.pipelines.SunlinecrawlPipeline': 300,
}
来源:https://www.cnblogs.com/bilx/p/11598692.html
0
投稿
猜你喜欢
- DJANGO_SETTINGS_MODULE使用Django时要通知Django当前使用的是哪个配置文件。可以改变环境变量 DJANGO_S
- 摘要: Portal是IT领域的新技术,是企业信息化工作的发展方向之一。本文首先介绍了Oracle Portal的定义、特点,接着阐述了po
- 首先创建scrapy项目命令:scrapy startproject douban_read创建spider命令:scrapy genspi
- 目录前言简介实现实现效果总结前言坦克大战是一款策略类的平面射击游戏,于 1985 年由 Namco 游戏公司发布,尽管时至今日已经有了很多衍
- 本文实例为大家分享了python实现微信消息防撤回的具体代码,供大家参考,具体内容如下使用了sqlite3保存数据,当有人撤回消息时取出数据
- 代理的使用场景编写爬虫代码的程序员,永远绕不开就是使用代理,在编码过程中,你会碰到如下情形:网络不好,需要代理;目标站点国内访问不了,需要代
- 简介这两天更新完Xcode8之后发现Xcode对图标的要求又有了变化,之前用的一个小应用“IconKit”还没赶上节奏,已经不能满足Xcod
- 很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录。在后台,这些程序使用在一个SELECT查
- 获取当前工作目录import sysprint(sys.path[0])获取执行命令的位置import osprint(os.getcwd(
- 本文实例讲述了Python爬取需要登录的网站实现方法。分享给大家供大家参考,具体如下:import requestsfrom lxml im
- 目的:JS+ASP打造无刷新新闻列表,下图所示的新闻列表相信大家并不少见,包括新闻的分页功能,本文要介绍的就是各分页间的切换方式。传统的方法
- Python docx module for Word or WPS processing本文是通过docx把word中的表格中的某些已填好
- 目录一、装饰器使用场景二、为什么需要装饰器1、先来看一个简单例子:2、增加需求3、又有需求三、基础装饰器入门1、装饰器语法糖2、对带参数的函
- 简介Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。casbin 的主要特性包括:支持自定义请求的格式
- 其实,这是一个非常容易解决掉的问题。在我看来,似曾相识,呵呵,最近学JavaScript可是学会了使用var声明变量。其实,在PHP中根本不
- 用途:图片经常使用onload来改变宽度,但这样会出现图片的闪烁,这个简单的类就是用来解决这个问题的。函数loadImage,用来加载图片,
- 使用executemany对数据进行批量插入的话,要注意一下事项:#coding:utf8conn = MySQLdb.connect(ho
- 过拟合问题实战1.构建数据集我们使用的数据集样本特性向量长度为 2,标签为 0 或 1,分别代表了 2 种类别。借助于 scikit-lea
- 如下所示:# -*- coding:utf-8 -*-import sysimport osfrom glob import globimp
- 导言DataList的编辑界面由EditItemTemplate里的标记语言和web控件定义。在目前为止所做的DataList编辑功能的例子