1. 前言
- 爬取数据用的 比 request功能强大多了
2. 安装
- 根据自己的环境选择安装哪个
- pip install scrapy
- pip list 查看依赖列表
- 权限问题可以install 后面加上 --user
- conda install scrapy
- conda list 查看依赖列表
- 指令
- scrapy -v 查看版本
- 终端输入 scrapy 会有相关的指令提示
3. 创建项目
- scrapy startproject 项目名称
- 其实也会有相关的指令提示
- cd 项目名称
- 大体的目录结构
scrapy1.png
4. 创建爬虫
- scrapy genspider 爬虫名称 网站域名
- 比如上图中的
novel
就是爬虫名称
5. 目录分析
- scrapy.cfg Scrapy项目的配置文件,其中包含项目的全局配置信息和设置
- scrrpy/目录 存放代码
- init.py:一个空文件,用于将该目录标记为Python的包目录
- items 定义用于存储抓取到的数据的数据模型
定义自己的Item类,用于保存抓取到的数据字段- middlewares.py:中间件文件,包含Scrapy的中间件组件。
中间件用于对请求和响应进行预处理或后处理的过程- pipelines.py:管道文件,包含Scrapy的管道组件。
管道用于对抓取到的数据进行处理和持久化,例如存储到数据库或文件中)- settings.py:Scrapy项目的配置文件,包含各种配置选项和参数,如请求头、下载延迟、管道设置等
- spiders/:存放爬虫文件的目录。爬虫文件是定义抓取逻辑的核心部分。
- init.py:一个空文件,将spiders/目录标记为Python的包目录。
6. 常用的指令
- 运行爬虫
- scrapy crawl 爬虫名称
爬虫的名字是 蜘蛛文件夹下 文件的 名字- 如果文件的名字 文件内 name 不一样,
- 那肯定是取 name对应的值才是 爬虫名
爬虫名.png
- 输出指定的文件
- 默认可以输出 csv json xml 格式的文件
- scrapy crawl novel -o noevl.csv
- -- nolog
- 简洁日志输出
- scrapy crawl novel -o noevl.csv --nolog
7. demo
items定义爬取字段
- items.py
import scrapy class NovelItem(scrapy.Item): # define the fields for your item here like: chapter = scrapy.Field() url = scrapy.Field()
novel 书写具体的爬虫路径
- spider/novel.py
import scrapy from scrapy import Selector from s01.items import NovelItem class NovelSpider(scrapy.Spider): name = "novel" allowed_domains = ["www.xxx.com"] start_urls = ["https://www.xxx.com/book/xiyouji"] # def parse(self, response): # print('response', response) sel = Selector(response) li_list = sel.css('div.book-mulu > ul > li') # print('li_list', li_list) # 伪装 for li_itm in li_list: novel = NovelItem() novel['chapter'] = li_itm.css("a::text").extract_first() novel['url'] = li_itm.css("a::attr(href)").extract_first() # print('novel', novel) yield novel
settings.py配置
- 18行 左右 伪装客户端
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
运行
- scrapy crawl novel -o noevl.csv --nolog
- 其实就可以直接输出 成对应的文件了
8. 管道/流 piplines
- 因为直接输出有时候有些问题 而且输出文件格式有限
- 所以可以单独写管道进行输出
比如也可以手写输出 Josn
class JsonPipeline: def __init__(self): self.data = [] self.fp = open("./练习.json","w",encoding="utf-8") # 钩子函数 拿到数据 就会走 def process_item(self, item, spider): # 具体数据 url = item.get('url','') chapter = item.get('chapter','') self.data.append((chapter,url)) if len(self.data) > 50: # self.fp.write(self.data) json.dump(self.data,self.fp, ensure_ascii=False) self.data.clear() # print('process_item-----json-----',item) return item def close_spider(self,spider): if len(self.data) > 0: # print('data--------- w--2',self.data) json.dump(self.data,self.fp, ensure_ascii=False) self.fp.close() print('关闭--json练习 🕷 ')
输出 excel/xlsx
- 当然写入
excel/xlsx
的方式非常多 自由选择
class ExcelPipeline: def __init__(self): # 工作库 注意大小写 self.wb = openpyxl.Workbook() # 工作表 work sheet 有很多个 self.ws = self.wb.active self.ws.title = '西游记' self.ws.append(('章节', '地址')) print('init------------') # 拿到数据就会走的钩子 def process_item(self, item, spider): chapter = item.get('chapter', "默认值") url = item.get('url') or "" self.ws.append( (chapter, url) ) print('拿到数据', item) return item def open_spider(self, spider): print('打开🕷-----') def close_spider(self, spider): self.wb.save('西游记.xlsx') print('关闭爬虫')
输出 数据库
9.
10.
10. 后记
- middleware中间件 可以配置 cookie等内容 伪装登录