scrapy 爬虫(学习)

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文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值