IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【Python】使用Scrapy 网络爬虫框架Demo -> 正文阅读

[Python知识库]【Python】使用Scrapy 网络爬虫框架Demo

安装

使用PyCharm安装,进入到PyCharm -> Preferences -> Project Interpreter,点击加号
在这里插入图片描述
查询框输入‘Scrapy’,点击‘Install Package’
在这里插入图片描述

使用shell调试工具

  1. 使用Scrapy提供的shell调试工具来抓取网页信息, 以爬取我的博客为例,如下
MAC-53796:PycharmProjects gcui$ scrapy shell https://blog.csdn.net/galen2016
...
...
...
[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x10672f050>
[s]   item       {}
[s]   request    <GET https://blog.csdn.net/galen2016>
[s]   response   <200 https://blog.csdn.net/galen2016>
[s]   settings   <scrapy.settings.Settings object at 0x106817090>
[s]   spider     <DefaultSpider 'default' at 0x106bab490>
[s] Useful shortcuts:
[s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser
>>>

可以看到返回200,说明抓取网页信息成功了。
注意,如果返回403,可能是网页开启了“防爬虫’,可以让Scrapy伪装成浏览器来解决,即在发送请求时添加User-Agent头,将User-Agent的值设置为浏览器发送请求的User-Agent。可以在浏览器的开发者模式中查到User-Agent。
例如,可以使用如下命令让Scrapy伪装成Chrome浏览器来开启shell调试

scrapy shell -s USER_AGENT='Mozilla/5.0' https://blog.csdn.net/galen2016
  1. 在Scrapy的shell控制台调用response的xpath()方法来获取Xpath匹配的节点,如获取博客的标题:
>>> response.xpath('//article//h4/text()').extract()
['PyCharm上传本地项目到GitLab - MacOS版', '【Docker】Docker运行Web UI自动化Demo', '[Mac] selenium打开Chrome浏览器', 'Python-常用的正则表达式', 'Docker - Dockerfile指令', '【Docker】docker容器管理总结', 'Postman/Newman+Docker+Jenkins/Pipeline 做接口自动化测试', 'Docker运行Postman/Newman', 'Docker -删除镜像(image)', '【Pytest】fixture使用request传参,结合parametrize', '【Pytest】使用Allure测试报告', '域名系统DNS 总结', 'Python - 日期、时间和日历操作', 'Python -日志模块使用', '动态主机配置协议DHCP', '2019年总结  - 收获很多', 'MacBook 复制文件和文件夹路径', '【Appium】Android Toast捕获', '【Appium】使用uiautomator定位元素', 'xpath不等于、不包含的写法']
>>>

创建Scrapy项目

  1. 选择一个目录,在命令行输入:scrapy startproject xxxx,最后一个参数是项目名,如下
MAC-53796:PycharmProjects gcui$ scrapy startproject BlogSpider
New Scrapy project 'BlogSpider', using template directory '/usr/local/lib/python3.7/site-packages/scrapy/templates/project', created in:
    /Users/gcui/PycharmProjects/BlogSpider

You can start your first spider with:
    cd BlogSpider
    scrapy genspider example example.com
MAC-53796:PycharmProjects gcui$
  1. 用PyCharm打开该项目,可以看到项目的目录如下:
    在这里插入图片描述
    scrapy.cfg: 项目的总配置文件,通常无需修改
    BlogSpider/items.py: 用于定义项目用到的Item类,也就是一个数据传输对象,需要由开发者来定义
    BlogSpider/pipelines.py: 项目的管道文件,负责处理爬取到的信息,需要由开发者来编写
    BlogSpider/setting.py: 项目的配置文件
    BlogSpider/spiders: 在该目录下存放项目所需的蜘蛛–负责抓取项目感兴趣的信息。

Scrapy开发步骤

  1. 定义Item类,定义被爬取对象的属性,如果博客标题、发布时间、阅读量等,在item.py中定义,如下:
import scrapy


class BlogspiderItem(scrapy.Item):
    # 博客标题
    title = scrapy.Field()
    # 发布时间
    publish_date = scrapy.Field()
    # 阅读量
    read_count = scrapy.Field()

  1. 编写Spider类,将该Spider类文件放在spiders目录下,然后用XPath或CSS来提取HTML页面中感兴趣的信息。
    Scrap提供了scrapy genspider命令,可以直接生成Spider类。先进入到BlogSpider目录下,然后运行:
MAC-53796:BlogSpider gcui$ scrapy genspider galen__blogs 'blog.csdn.net/'
Created spider 'galen__blogs' using template 'basic' in module:
  BlogSpider.spiders.galen__blogs
MAC-53796:BlogSpider gcui$ 

以上命令在BlogSpider/spiders目录下生成了galen_blogs.py, 如下图:
在这里插入图片描述
重写Spider类,主要是将要爬取的各页面URL定在start_url列表中,然后在parse方法中通过XPath或CSS提取感兴趣的信息,如下:

import scrapy
from BlogSpider.items import BlogspiderItem


class GalenBlogsSpider(scrapy.Spider):
    # 定义该Spider的名字
    name = 'galen__blogs'
    # 定义该Spider允许爬取的域名
    allowed_domains = ['blog.csdn.net/']
    # 定义该Spider爬取的首页列表
    start_urls = ['https://blog.csdn.net/galen2016']

    # 该方法负责提取response所包含的信息
    # response 代表下载器从start_urls中的每个URL下载得到的响应
    def parse(self, response):
        # 遍历页面中的所有 //article[@class="blog-list-box"] 节点
        for article in response.xpath('//article[@class="blog-list-box"]'):
            item = BlogspiderItem()
            item['title'] = article.xpath('.//h4/text()').extract_first()
            item['publish_date'] = article.xpath('.//div[@class="view-time-box"]/text()').extract_first()
            item['read_count'] = article.xpath('.//span[@class="view-num"]/text()').extract_first()
            yield item

最后一行代码使用yield语句将item对象返回给Scrapy引擎,然后Scrapy引擎将这些item收集起来传给项目的Pipeline。
3. 编写pipelines.py文件,目前只是简单的在控制台打印item数据,没有使用数据库。如下:

class BlogspiderPipeline:
    def process_item(self, item, spider):
        print('博客标题:', item['title'])
        print('发布时间:', item['publish_date'])
        print('阅读量:', item['read_count'])

Scrapy引擎会自动将Spider捕获的所有item逐个传给process_item(self, item, spider)方法,因此该方法只需处理单个的item即可。
4. 修改settings.py文件,将如下行取消注释

ITEM_PIPELINES = {
   'BlogSpider.pipelines.BlogspiderPipeline': 300,
}
  1. 启动Spider,命令行进入到项目根目录下,输入如下命令:
MAC-53796:BlogSpider gcui$ scrapy crawl galen__blogs

最后一个参数 galen_blogs就是前面定义的Spider名称。运行上面命令之后,可以获取如下结果:
在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:25:00  更:2022-02-28 15:25:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:32:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码