Python 萌新 - 花10分钟学爬虫

这篇具有很好参考价值的文章主要介绍了Python 萌新 - 花10分钟学爬虫。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言
Python 新手入门很多时候都会写个爬虫练手,本教程使用 Scrapy 框架,帮你简单快速实现爬虫,并将数据保存至数据库。在机器学习中数据挖掘也是十分重要的,我的数据科学老师曾经说过,好算法不如好数据。

Python助学大礼包点击免费获取

一级目录

安装 Scrapy (系统默认安装了 Python):

$ pip install Scrapy

在当前目录新建工程

$ scrapy startproject yourproject

新建工程文件结构如下:

yourproject/
----|scrapy.cfg             # 部署配置文件
    |yourproject/           # 工程目录
    |----__init__.py
    |----items.py           # 项目数据文件
    |----pipelines.py       # 项目管道文件
    |----settings.py        # 项目设置文件
    |----spiders/           # 我们的爬虫 目录
        |----__init__.py    # 爬虫主要代码在这里    

简单的爬虫主要使用了 spiders、items、pipelines,age这三个文件:

  • spider :爬虫的主要逻辑。
  • items :爬虫的数据模型。
  • pipelines : 爬虫获取到的数据的加工工厂,可以进行数据筛选或保存。

二、数据模型:items

分析网页的信息我们可以看到网页主体是一个列表,列表每一行都包含可一句引用、作者名字、标签等信息。作者名右边点击(about)可以看到作者的详细信息,包括介绍、出生年月日、地点等等。根据上面的数据,我们可以先创建如下数据模型:

items.py

import scrapy

# quote 我们要爬取的主体
class QuoteItem(scrapy.Item):
    text = scrapy.Field()
    tags = scrapy.Field()
    author = scrapy.Field()

    next_page = scrapy.Field()
    pass
    
# quote 的作者信息 对应 QuoteItem.author
class AuthorItem(scrapy.Item):
    name = scrapy.Field()
    birthday = scrapy.Field()
    address = scrapy.Field()
    description = scrapy.Field()
    pass

所有的模型必须继承scrapy.Item,完成这一步我们就可以开始写爬虫的逻辑了。

# 完整的 QuoteItem 数据结构示例
{
    text,
    tags,
    author:{
        name,
        birthday,
        address,
        description
    }
}

三、爬虫:spider

Python 萌新 - 花10分钟学爬虫
既然是爬虫,自然需要去爬取网页,爬虫部分的几个要点:

  1. 引入你创建的数据模型
  2. 首先爬虫类要继承scrapy.Spider
  3. 设置爬虫的名字name,启动爬虫时要用。
  4. 将你要爬取的网址放入start_requests(),作为爬虫的起点。
  5. 爬取的网页信息成功后,在的请求响应parse()中解析。

spiders/init.py

  • 在顶部引入创建的数据模型。
import scrapy
from ScrapySample.items import QuoteItem
from ScrapySample.items import AuthorItem
  • 爬虫类,name->爬虫名字,allowed_domains->爬取网页的白名单。
class QuotesSpider(scrapy.Spider):
    name = "quotes"
    allowed_domains = ["quotes.toscrape.com"]

start_requests()中记录你要爬取的网址。
可以只放入一个网址,然后让爬虫自己爬取起始网址中下一页的链接。也可以在这里把所有需要爬的网址直接放入,比如说page一般是从1开始,并且有序的,写一个for循环可以直接输入所有页面的网址。
本文使用的是让爬虫自己去爬取下一页网址的方式,所以只写入了一个起始网址。

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)
  • 如下代码,爬取网页成功之后,我们要分析网页结构,找到我们需要的数据。

我们先来看XPath语法,//div[@class=“col-md-8”]/div[@class=“quote”:这是表示查找 class 为"col-md-8"的 div 节点下的一个子节点,并且子节点是一个 class 为“quote” div 节点。如果在当前页面找到了这样一个节点,则返回节点信息,如果没有找到则返回None

    def parse(self, response):
        # 通过查看器,找到列表所在的节点
        courses = response.xpath('//div[@class="col-md-8"]/div[@class="quote"]')

        for course in courses:
            # 将数据模型实例化 并从节点中找到数据填入我们的数据模型
            item = QuoteItem()
            # 轮询 course 节点下所有 class 为 "text" 的 span 节点,获取所有匹配到的节点的 text() ,由于获取到的是列表,我们默认取第一个。
            item['text'] = course.xpath('.//span[@class="text"]/text()').extract_first()
            item['author'] = course.xpath('.//small[@class="author"]/text()').extract_first()
            item['tags'] = course.xpath('.//div[@class="tags"]/a/text()').extract()

            # 请求作者详细信息
            author_url = course.xpath('.//a/@href').extract_first()
            # 如果作者介绍的链接不为空 则去请求作者的详细信息
            if author_url != '':
                request = scrapy.Request(url='http://quotes.toscrape.com'+author_url, dont_filter=True, callback=self.authorParse)
                # 将我们已经获取到的 QuoteItem 传入该请求的回调函数 authorParse(),在该函数内继续处理作者相关数据。
                request.meta['item'] = item
                yield request
        
        # 继续爬向下一页 该函数具体实现下面会分析
        next_page_request = self.requestNextPage(response)
        yield next_page_request
  • 爬取作者详细信息
    成功获取作者详细信息 AuthorItem 后并且赋值给 QuoteItem 的属性 author ,这样一个完整的引述信息 QuoteItem 就组装完成了。
    def authorParse(self, response):
        # 先获取从 parse() 传递过来的 QuoteItem
        item = response.meta['item']
        # 通过查看器,找到作者详细信息所在节点
        sources = response.xpath('//div[@class="author-details"]')
        
        # 实例化一个作者信息的数据模型
        author_item = AuthorItem()
        # 往作者信息模型填入数据
        for source in sources:
            author_item['name'] = source.xpath('.//h3[@class="author-title"]/text()').extract_first()
            author_item['birthday'] = source.xpath('.//span[@class="author-born-date"]/text()').extract_first()
            author_item['address'] = source.xpath('.//span[@class="author-born-location"]/text()').extract_first()
            author_item['description'] = source.xpath('.//div[@class="author-description"]/text()').extract_first()
    
        # 最后将作者信息 author_item 填入 QuoteItem 
        item['author'] = author_item
        # 保存组装好的完整数据模型
        yield item
  • 爬虫自己找到出路(下一页网页链接)

通过查看器我们可以找到下一页按钮元素,找到该节点并提取链接,爬虫即奔向下一个菜园。

    def requestNextPage(self, response):
        next_page = response.xpath('.//li[@class="next"]/a/@href').extract_first()
        # 判断下一个是按钮元素的链接是否存在
        if next_page is not None:
            if next_page != '':
                return scrapy.Request(url='http://quotes.toscrape.com/'+next_page, callback=self.parse)
        return None

爬虫的主要逻辑到这里就结束了,我们可以看到,一小段代码就可以实现一个简单的爬虫。一般主流网页都针对防爬虫做了一些处理,实操过程中也许并不会这么顺利,我们可能需要模仿浏览器的User-Agent,或者做访问延时防止请求过于频繁等等处理。

四、数据处理:pipelines

pipelines是 Scrapy 用来后续处理的管道,可以同时存在多个,并且可以自定义顺序执行,通常用来做数据处理和数据保存。我们需要在 settings.py文件中设置需要需要执行的管道和执行顺序。

# 在 settings.py 加入下面的代码
ITEM_PIPELINES = {
   'ScrapySample.pipelines.ScrapySamplePipeline': 300,
}

在这里我只使用了一个管道ScrapySamplePipeline,用来将数据保存到数据库当中,后面的数字300是表示该管道的优先级,数字越小优先级越高。
由于我们要保存数据到数据库,所以我们需要先在本地搭建起数据库服务,我这里用的是MySQL,如果没有搭建的小伙伴可以下个 MAMP 免费版本,安装好傻瓜式操作一键启动Apache、MySQL服务。当然,数据库和表还是要自己建的。

# 在 pipelines.py 中加入数据库配置信息
config = {
    'host': '127.0.0.1',
    'port': 8081,
    'user': 'root',
    'password': 'root',
    'db': 'xietao',
    'charset': 'utf8mb4',
    'cursorclass': pymysql.cursors.DictCursor,
}

我们可以在init()函数里做一些初始化工作,比如说连接数据库。
然后process_item()函数是管道处理事件的函数,我们要在这里将数据保存入数据库,我在这个函数里写了一些插入数据库操作。
close_spider()函数是爬虫结束工作时候调用,我们可以在这里关闭数据库。

class ScrapySamplePipeline(object):

    def __init__(self):
        # 连接数据库
        self.db = sql.connect(**config)
        self.cursor = self.db.cursor()

    def process_item(self, item, spider):
        # 先保存作者信息
        sql = 'INSERT INTO author (name, birthday, address, detail) VALUES (%s, %s, %s, %s)'
        self.cursor.execute(sql, (item['author']['name'], item['author']['birthday'], item['author']['address'], item['author']['description']))
        # 获取作者id
        author_id = self.cursor.lastrowid

        # 保存引述信息
        sql = 'INSERT INTO spider (text, tags, author) VALUES (%s, %s, %s)'
        self.cursor.execute(sql, (item['text'], ','.join(item['tags']), author_id))
        self.db.commit()

    # 即将结束爬虫
    def close_spider(self, spider):
        self.db.close()
        self.cursor.close()
        print('close db')

如果不需要保存数据库或者对数据处理的话, close_spider()pipelines这部分是可以忽略的。这个时候在命令行切换到工程目录下,输入开始执行爬虫命令:

$ scrapy crawl quotes

部分不保存到数据库的小伙伴可以使用下方命令,将爬取的数据以 Json 格式导出到该工程目录下。

$ scrapy crawl quotes -o quotes.json

最后贴上数据库数据成功录入的截图。

Python 萌新 - 花10分钟学爬虫
Python 萌新 - 花10分钟学爬虫文章来源地址https://www.toymoban.com/news/detail-457753.html

↓ ↓ ↓ 加下方名片找我,直接拿源码还有案例 ↓ ↓ ↓

到了这里,关于Python 萌新 - 花10分钟学爬虫的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python】新手入门(8):什么是迭代?迭代的作用是什么?

    【Python】新手入门(8):什么是迭代?迭代有什么应用? 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~ 💡 创作高质量博文(平均质量分92+),分享更多关于深度

    2024年03月10日
    浏览(92)
  • python入门级新手接单一单两百块,经验方法分享

    如何利用python在网上接单赚钱,兼职也能月入过万 学习python编程,不仅可以找到一份高薪工作,而且不打算转化或者是在校学生的话,也能为你的日常生活提高一些帮助,比如:自动化办公 爬取一些数据信息之类的.....另外闲暇时间也可以在网上接点小单,增加些收入 至少

    2023年04月19日
    浏览(32)
  • Python 安装教程,新手入门(超详细)含Pycharm开发环境安装教程

    目录 一、Python介绍 二、Python安装教程 (一)Python的下载 (二)Python的安装 三、Pycharm开发工具的安装 (一)Pycharm介绍 (二)Pycharm的下载 (三)Pycharm的安装 ​        Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替

    2024年01月20日
    浏览(70)
  • Python保姆级教程 数据类型—新手小白入门必看系列

    推荐使用压缩软件和杀毒软件 7 - zip 使用火绒 优点: 代码说明 没注释的代码 有注释的代码 不让解释器执行注释的那句话 单行注释快捷键:ctrl + ? \\\"\\\"\\\"\\\"\\\"\\\" (三个双引号) 185730213551 什么是变量:可以改变的量 计算机用来存贮数据的盒子,想用这个数据,就直接那盒子就好了

    2024年02月16日
    浏览(39)
  • Python新手入门必须学会的技巧:pycharm中配置Python解释器(2022最新)

    有很多小伙伴,在安装模块时成功了,但是在pycharm导入模块的时候报错了,或者运行没有结果,基本上都是这个问题。 我下午在群里刚解决了一个这样的问题,她说不管什么代码都运行没结果,hello world 都打印不出来结果,也不报错,在群里问了半天,还好我看到了,不然

    2024年02月09日
    浏览(47)
  • 【Python】新手入门学习:详细介绍开放封闭原则(OCP)及其作用、代码示例

    【Python】新手入门学习:详细介绍开放封闭原则(OCP)及其作用、代码示例 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~ 💡 创作高质量博文(平均质量分92+),分

    2024年03月14日
    浏览(40)
  • 很合适新手入门使用的Python游戏开发包pygame实例教程-01[开发环境配置与第一个界面]

    我们假定你已经安装好了我们开发python程序的sublime text,如果不知道怎么安装的可以参照我前面的博文。这里只需要解决的是配置好Pygame的问题。本篇博文主要解决开发环境配置以及第一个游戏界面的显示问题。 文章原出处: https://blog.csdn.net/haigear/article/details/130173836 没有

    2024年01月25日
    浏览(79)
  • GitHub新手用法详解【适合新手入门-建议收藏!!!】

    目录 什么是Github,为什么使用它? 一、GitHub账号的注册与登录 二、 gitbash安装详解 1.git bash的下载与安装 2.git常用命令  3. Git 和 GitHub 的绑定 1. 获取SSH keys  2.绑定ssh密钥 三、通过Git将代码提交到GitHub 1.克隆仓库   2.测试提交代码         GitHub是一个面向开源及私有软件项

    2023年04月24日
    浏览(40)
  • Midjourney新手入门指南

    我们来看一下百度百科的回复 是不是有点蒙,没关系,一句话概括:用描述来生成图像的AI工具。 你可能又有一门了,discord是什么?为什么要下载它?我们来看看百度百科 原因:Midjouney 没有自己的客户端,它是搭载在Discord上。 Discord 简单来说,就是一个聊天应用。

    2024年02月10日
    浏览(57)
  • PyCharm新手入门指南

    安装好Pycharm后,就可以开始编写第一个函数:Hello World啦~我们就先来学习一些基本的操作,主要包含新建Python文件,运行代码,查看结果等等。 文章主要包含五个部分: 一、界面介绍 主要分为菜单栏、项目目录、编辑区域、终端区和运行/调试代码区域。 1、菜单栏:一些新

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包