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等内容 伪装登录
网友评论