数据分析利器Python——爬虫(含爬取过程、Scrapy框架介绍)

文章目录

    • 一、基础知识
      • 1、定义
      • 2、基本架构
    • 二、URL管理模块
    • 三、网页下载模块
      • Python中的requests模块
    • 四、网页解析模块
      • 1、结构化网页解析
      • 2、BeautifulSoup使用步骤
        • 2.1 创建BeautifulSoup对象
        • 2.2、查询节点
        • 2.3、获取节点信息
          • Tag对象属性:
          • 间接获取节点信息
      • 3、Scrapy框架
        • 3.1、简介
        • 3.2、安装

一、基础知识

1、定义

是自动获取互联网信息的程序,用来对互联网信息进行分析、开发产品。

2、基本架构

URL管理模块:对计划爬取或已经爬取的URL进行管理(已爬取不再爬取,未爬取则爬取,已失效网站检测等)
网页下载模块:将URL管理模块中指定的URL进行访问下载
网页解析模块:解析网页下载模块中的URL,处理或保存数据;若解析到需要继续爬取的URL,则返回URL管理模块继续循环。
数据分析利器Python——爬虫(含爬取过程、Scrapy框架介绍)_第1张图片
上图介绍了爬虫的流程,是学习本节的基础。

二、URL管理模块

防止重复爬取和循环指向
功能:

  • 可以添加新的URL
  • 管理已经爬取和未爬取的URL
  • 获取待爬取的URL

实现方式:

  • Python的set集合数据结构(使用了集合中数据的唯一性,适用于数据简单情况)
  • 数据库中的数据表(创建的时候打标签,标记flag位)

三、网页下载模块

将URL对应的网页下载到本地或读入内存(字符串)

Python中的requests模块

request.get(url) 返回request对象,通过request对象的方法获取想要的信息
属性:
status_codes:状态码

常见的状态码:

  • 200:请求成功
    404:请求的资源不存在
    500:内部服务器错误

headers:网页的header信息
encoding:网页编码
text:请求返回的文本信息
content: 以字节形式的非文本信息(图片等)

# 使用jupyter notebook
import requests
url = "https://www.baidu.com"
r_obj = requests.get(url)
r_obj.status_code # 返回状态码
r_obj.encoding = 'utf-8' # 若返回text时出现乱码则先将编码设置为utf-8格式再返回文本
r_obj.text

四、网页解析模块

从已下载网页中解析所需内容

实现方式:

  • 字符串匹配
  • html.parser:Python自带的解析html的工具
  • BeautifulSoup:结构化的网页解析

1、结构化网页解析

DOM(Document Object Model),文档对象模型
数据分析利器Python——爬虫(含爬取过程、Scrapy框架介绍)_第2张图片

2、BeautifulSoup使用步骤

2.1 创建BeautifulSoup对象

BeautifulSoup(
url,
html_parser 指定解析器
encoding 指定编码格式(和网页编码格式一致)
)

2.2、查询节点

find(),找到第一个满足条件的节点
find_all(),找到所有满足条件的节点

方法:按照节点类型或属性查找(需要了解前端开发的部分知识)

  • 按照类型查找:find_all(‘a’) 找到所有的链接【a标签代表链接】
  • 按照属性查找:find_all(‘a’, href=‘test.html’)找到href='test.html的链接

2.3、获取节点信息

查找节点返回的是Tag对象,获取Tag对象信息
【因为一个标签会有很多属性,所以返回的Tag对象是字典类型】

Tag对象属性:
  • Tag.name:节点标签名称,‘a’
  • Tag.attrs:返回节点的属性s,字典类型
  • Tag.text:获取节点文本
间接获取节点信息

children:只返回“孩子节点”
desendants:返回所有子孙节点
next_siblings:返回下一个“同辈节点”
previous_siblings:返回上一个“同辈节点”
parent:返回“父亲节点”
举个栗子

# 使用jupyter notebook
import requests
from bs4 import BeautifulSoup
url = "https://www.baidu.com"
r_obj = requests.get(url)
bs = BeautifulSoup(r_obj.content,
					'lxml' # 解析器
					from_encoding='utf-8'# 指定编码
					)
bs.find('title') # 找title标签
link_tag = bs.find('a') # 找到第一个链接新闻

3、Scrapy框架

3.1、简介

开源的爬虫框架,用于爬取web站点并从页面中提取结构化数据,可用于数据挖掘,检测,自动化测试。

高级特性

  • 内置数据抽取CSS/XPath/re
  • 交互式控制台用于调试
  • 结果输出的格式控制,json、csv、xml等
  • 自动处理编码
  • 可自定义扩展

爬取步骤如图
数据分析利器Python——爬虫(含爬取过程、Scrapy框架介绍)_第3张图片

3.2、安装

pip install scrapy
检测是否安装成功:scrapy bench
使用步骤:

  1. 创建工程

  2. 定义Item,构造爬取的对象(可选)

  3. 编写爬虫主体
    - 使用BeautifulSoup解析网页内容
    - 调用自制的Item

  4. 编写配置和管道,用于处理爬虫结果(可选)

  5. 执行爬虫

# (1)创建工程scrapy startproject 名字
scrapy startproject tutorial
# (2)编写Spyder
cd tutorial
scrapy genspider aqi_spider http://www.pm25.in/
 # aqi_spider为自定义的spider名称

使用Pycharm打开创建的工程并打开对应的Spyder文件,编辑想要输出的代码

数据分析利器Python——爬虫(含爬取过程、Scrapy框架介绍)_第4张图片
scrapy crawl api_spider 
# 运行Spyder文件,api_spider为可定义的名字,与上文的(2)步中同名

含Item的爬取操作举例(Item:将爬取的数据封装成对象,通过对象访问爬取的一些属性)同样操作aqi_spider.py文件,在类下加入如下方法

    def parse(self,response):
        bs = BeautifulSoup(response.body,'lxml')
        div_obj = bs.find('div',class_ = 'all')
        li_tag_list = div_obj.find_all('li')
        for li_tag in li_tag_list:
            city_item = CityItem()
            city_item['city_name'] = li_tag.find('a').text
            city_item['city_link'] = li_tag.find('a')['href']
            yield city_item

接下来对数据进行进一步处理——编写配置Pipeline。主要目的是处理之前解析的Item,将文件保存
首先,需要在setting.py中配置信息。
数据分析利器Python——爬虫(含爬取过程、Scrapy框架介绍)_第5张图片
添加open_spider()函数,close_spider()函数
数据分析利器Python——爬虫(含爬取过程、Scrapy框架介绍)_第6张图片
通过scrapy crawl api_spider语句运行文件后会在目录中产生一个cities.csv文件

你可能感兴趣的:(Python,python,爬虫,数据分析)