项目开发流程
创建项目
创建爬虫
提取数据
保存数据
创建scrapy框架项目
scrapy startproject <项目名称>
创建爬虫
通过命令创建出爬虫文件,爬虫文件为主要的代码作业文件,通常一个网站的爬取动作都会在爬虫文件中进行编写。
命令:
项目路径下执行
scrapy genspider <爬虫名字> <允许爬取的域名>
爬虫名字: 作为爬虫运行时的参数
允许爬取的域名:为对于爬虫设置的爬取范围,设置之后用于过滤要爬取的url,如果爬取的url与允许的域不通则被过滤掉。
cd myspider
scrapy genspider itcast itcast.cn
prase函数作用为对url访问后返回的对象进行的操作
运行scrapy
scrapy crawl <爬虫名称>
在项目目录下执行scrapy crawl itcast
运行爬虫文件
运行结果:
在项目目录下生成了itcast.html文件
定位元素以及提取数据、属性值的方法
解析并获取scrapy爬虫中的数据: 利用xpath规则字符串进行定位和提取
- response.xpath方法的返回结果是一个类似list的类型,其中包含的是selector对象,操作和列表一样,但是有一些额外的方法
- 额外方法extract():返回一个包含有字符串的列表
- 额外方法extract_first():返回列表中的第一个字符串,列表为空没有返回None
response响应对象的常用属性
- response.url:当前响应的url地址
- response.request.url:当前响应对应的请求的url地址
- response.headers:响应头
- response.requests.headers:当前响应的请求头
- response.body:响应体,也就是html代码,byte类型
- response.status:响应状态码
例子
import scrapy
class ItcastSpider(scrapy.Spider):
name = 'itcast'
allowed_domains = ['itcast.cn']
start_urls = ['https://www.xxxx.cn/channel/teacher.shtml#ajavaee']
def parse(self, response):
#获取所有教师节点
node_list=response.xpath('//div[@class="li_txt"]')
print(len(node_list))
#遍历教师节点列表,在每个教师节点中提取数据
for node in node_list:
temp={}
#xpath方法返回的是选择器对象列表
#scrapy框架中xpath返回的与平常的xpath不一样
#平时这个xpath语句会直接返回字符串列表,但是在scrapy框架中会返回一个selector对象列表,需通过索引取出selector对象,
#在通过特有的方法取selector对象的值
temp['name']=node.xpath('./h3/text()').extract_first()
temp['title'] = node.xpath('./h4/text()').extract_first()
temp['desc'] = node.xpath('./p/text()')[0].extract()
#extract:提取selector对象中的值,extract_first():提取第一个selector对象中的值
#xpath结果为只有一个值的列表,可以使用extract_first(),如果为多个值则使用extract
yield temp
分析:
1.设置start_urls访问的url,进行访问并返回
2.在响应返回的数据中通过xpath筛选出需要的节点返回一个selector对象列表
3.通过循环遍历列表中的每个selector对象,用xpath对每个selector对象进行筛选并返回一个新的selector对象列表
4.用extract或者extract_first()对每个新的selector对象进行数据提取
保存数据
利用管道pipeline来处理(保存)数据
在pipelines.py文件中定义对数据的操作
- 定义一个管道类
- 重写管道类的process_item方法
- process_item方法处理完item之后必须返回给引擎
步骤:
爬虫文件中parse函数返回的数据将传送到项目目录下pipelines.py文件的管道类中
在settings.py中删除注释,启用管道类
名字含义依次是:项目名称,pipelines.py文件,TestSpiderPipeline管道类名
300为管道执行的顺序
执行后查看是否启用管道类
在管道类TestSpiderPipeline中对爬虫文件返回的数据进行保存操作
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
import json
from itemadapter import ItemAdapter
class TestSpiderPipeline:
def __init__(self):
self.file=open('itcast.json','w')
def process_item(self, item, spider):
#将字典数据序列号
json_data=json.dumps(item) +',\n'
#将数据写入文件
self.file.write(json_data)
return item
def __del__(self):
self.file.close()
保存的数据