Python爬虫(学习)
开发环境
查看python版本,是否已安装
C:\Users\森哥>python -V
Python 3.9.7
查看pip版本
C:\Users\森哥>pip --version
pip 22.1.1 from C:\Users\森哥\AppData\Local\Programs\Python\Python39\lib\site-packages\pip (python 3.9)
安装scrapy
pip install Scrapy
入门案例
新建项目
scrapy startproject demo01[项目名]
创建后会有以下目录结构
demo01/
scrapy.cfg
demo01/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
这些文件分别是:
- scrapy.cfg: 项目的配置文件。
- demo01/: 项目的Python模块,将会从这里引用代码。
- demo01/items.py: 项目的目标文件。
- demo01/pipelines.py: 项目的管道文件。
- demo01/settings.py: 项目的设置文件。
- demo01/spiders/: 存储爬虫代码目录。
制作爬虫
在demo01/spiders目录下会有一个默认的examply.py可以直接在这里编写,也可以执行以下命令创建一个新的文件
scrapy gensipder itcast "itcast.cn"
我这里就直接在examply.py中编写
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["example.cn"]
start_urls = (
"http://www.example.cn/",
)
def parse(self, response):
pass
- name = “” -> 这个是爬虫的识别名称,必须唯一,在执行爬虫命令时会用到这个
- allo_domains = [] -> 搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。也就是可以理解为从这些网站内爬取(我是大概这么理解)
- start_urls = () -> 爬取的URL元祖/列表。具体的爬取页面吧
- parse(self, response) -> 解析的方法。主要的执行程序
我们读取网站 http://www.itcast.cn/ 的网站标题,修改代码如下
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["itcast.cn"]
start_urls = (
"http://www.itcast.cn/",
)
def parse(self, response):
context = response.xpath('/html/head/title/text()')
title = context.extract_first()
print(title)
pass
执行以下命令
scrapy crawl example
如果在终端中看到网站标题说明成功爬取到。
在执行爬虫时可以看到在终端中输出了许多的日志,如果不想看到可以修改配置文件。打开settings.py
文件,将日志等级改为WARNING
。
LOG_LEVEL = 'WARNING'
接下来我们试着爬取更多的信息
首先获取网站源代码
创建一个新文件
scrapy gensipder itcast "itcast.cn"
在itcast.py中输入
import scrapy
class ItcastSpider(scrapy.Spider):
name = "itcast"
allowed_domains = ["itcast.cn"]
start_urls = ["http://www.itcast.cn/channel/teacher.shtml"]
def parse(self, response):
filename = "teacher.html"
open(filename, 'w', encoding='utf-8').write(response.text)
pass
在spiders目录下执行
scrapy crawl itcast
在spiders目录小就会生成一个teacher.html文件,里面存放这网站的源代码
<div class="li_txt">
<h3>刘老师</h3>
<h4>高级讲师</h4>
<p>10年以上的软件开发经验和丰富的教学经验。精通Java、JavaScript、及Android系统架构,参于过开源项目phoneGap的开发并提交patch(PhoneGap 后改名为 Apache Cordova),主要作品有神州付系列和钱袋宝系列产品,(钱袋宝团队后并入美团支付),指导并参于多个项目:百度输入法、捕鱼达人、百思不得姐、海尔智能家居、乐视机顶盒、口语100等众多软件。</p>
</div>
可以看到老师信息在li_txt
这个修饰器下
我们在items.py
文件中定义TeacherItem
类
class TeacherItem(scrapy.Item):
name = scrapy.Field()
title = scrapy.Field()
info = scrapy.Field()
修改example.py
文件
import scrapy
from demo01.items import TeacherItem
class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["itcast.cn"]
start_urls = ("http://www.itcast.cn/channel/teacher.shtml",)
def parse(self, response):
# 使用选择器提取数据并写入文件
teachers = response.css(".li_txt")
for teacher in teachers:
# 声明一个TeacherItem实体
teacher_item = TeacherItem()
# 以字典的形式存放
teacher_item['name'] = teacher.css("h3::text").extract_first()
teacher_item['title'] = teacher.css("h4::text").extract_first()
teacher_item['info'] = teacher.css("p::text").extract_first()
print(teacher_item)
yield teacher_item
执行scrapy crawl example
命令,就会看到终端中输出了对应数据
当我们想存储为csv文件,可以修改执行命令
执行scrapy crawl exmaple -o teachers.csv
就会将数据存储在teachers.csv文件中
打开csv文件,你会看到是这样的,不太美观
info,name,title
深入研究过C、C++、VB、VC等语言,后采用Java开发,数据库使用Oracle、SQLServer、MySQL、熟练掌握JavaScript、CSS、XML等技术,掌握C/S、B/S开发模式。曾开发过C/S系统,B/S模式使用JSP和Java、Struts、Hibernate等。,杨老师,高级讲师
拥有8年企业级实战经验,曾主导开发过基于云计算的TOB商品平台,最高日访问量达百万,维护多平台的数据对接和集群搭建,熟练使用Java语言进行Web开发,对主流SSM框架底层实现有过深入了解,并熟练掌握SpringCloud、Dubbo等微服务解决方案。,赵老师,高级讲师
擅长Java EE企业级应用,十余年项目管理经验,曾担任开发工程师,架构师等重要角色。主导多个大型项目的架构设计、管理等工作。在互联网项目领域具备丰富的经验,精通微服务架构,擅长解决高并发,亿级数据量等架构设计,拥有广泛的技术面与实践经验。,姜老师,高级讲师
"15年软件开发与教学经验,熟练掌握MySQL、Redis、SSM框架、Dubbo、ZooKeeper、SpringBoot、SpringCloud等技术,主持与参与过市级财务系统,企业管理等系统开发。熟悉分布式技术,了解微服务架构,具备多个行业项目产品开发与管理经验,对培训有深刻的理解和把握。",杜老师,高级讲师
"具有多年开发经验,曾先后在重庆科普、微创、爱奇艺等多家软件公司担任软件开发工程师、项目经理等职务,精通Java EE、Struts2、Spring、Hibernate应用开发。",石老师,高级讲师
19年软件开发与教学经验。先后在中科富星、Radvision、河北恒信等企业担任开发工程师、架构师等职务。主导和参与的项目有吉林长春市公民信息查询与核查系统、iContact、iCM等视频会议产品的研发维护、恒信卡包项目、恒信pbox内容分发系统等。擅长的技术方向有Java SE、Java EE、多种开源框架、并发编程、分布式编程、大数据处理等。对各种技术的原理有较深研究,喜欢用代码说明问题。,满老师,高级讲师
6年软件开发与教学经验,曾在北京航天四创、中科软等单位担任研发经理职务,曾主持参与浙江省机要系统、国家电网系统、济宁市医疗平台、中国电信网络规划平台、人民日报社扶贫APP的设计开发工作。精通分布式、大数据、微服务、高并发、高可用等相关技术架构。,郭老师,高级讲师
前融商集团CTO、P2P架构,汇金融商所架构师,天津智慧城市项目负责人,研究院项目研究员、互联网企业内训师。专注于大型分布式架构,擅长自定义服务框架,深度参与 0 到 1 亿用户的技术架构体系搭建与架构优化工作。,
我们试着将数据存储为xlsx文件
我们打开pipelines.py
文件,这是管道文件
我们需要引入一个第三方库来帮助我们完成
pip install openpyxl
修改文件如下
# pipelines.py
from itemadapter import ItemAdapter
# 引入openpyxl
import openpyxl
class Demo01Pipeline:
# 初始化,爬虫前会执行
def __init__(self, **kwargs):
# 创建一个新的工作簿对象
self.wb = openpyxl.Workbook()
# 选择默认的活动工作表,也可以创建一个新的
self.ws = self.wb.active
# 创建新的活动工作表
# self.ws = self.wb.create_sheet()
# 设置表名
self.ws.title = "Teacher_info"
# 表中的单元栏名
self.ws.append(('名字','职位','内容'))
# 爬虫结束时执行
def close_spider(self, spider):
# 保存xlsx名为老师数据
self.wb.save('老师数据.xlsx')
# 爬虫进行时执行
def process_item(self, item, spider):
# 获取返回体中的数据,数据空时设置为''
name = item.get('name','')
title = item.get('title','')
info = item.get('info','')
# 存在对应单元栏中
self.ws.append((name,title,info))
return item
我们还需要修改settings.py
文件中的配置
ITEM_PIPELINES = {
"demo01.pipelines.Demo01Pipeline": 300,
}
# 将上面的注释取消
执行命令scrapy crawl example --nolog
不输出日志
执行完成后就会有对应的老师数据.xlsx
文件