一、基础知识
1、定义
是自动获取互联网信息的程序,用来对互联网信息进行分析、开发产品。
2、基本架构
URL管理模块:对计划爬取或已经爬取的URL进行管理(已爬取不再爬取,未爬取则爬取,已失效网站检测等) 网页下载模块:将URL管理模块中指定的URL进行访问下载 网页解析模块:解析网页下载模块中的URL,处理或保存数据;若解析到需要继续爬取的URL,则返回URL管理模块继续循环。 上图介绍了爬虫的流程,是学习本节的基础。
二、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: 以字节形式的非文本信息(图片等)
import requests
url = "https://www.baidu.com"
r_obj = requests.get(url)
r_obj.status_code
r_obj.encoding = 'utf-8'
r_obj.text
四、网页解析模块
从已下载网页中解析所需内容
实现方式:
- 字符串匹配
- html.parser:Python自带的解析html的工具
- BeautifulSoup:结构化的网页解析
1、结构化网页解析
DOM(Document Object Model),文档对象模型
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:返回“父亲节点” 举个栗子
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')
link_tag = bs.find('a')
3、Scrapy框架
3.1、简介
开源的爬虫框架,用于爬取web站点并从页面中提取结构化数据,可用于数据挖掘,检测,自动化测试。
高级特性:
- 内置数据抽取CSS/XPath/re
- 交互式控制台用于调试
- 结果输出的格式控制,json、csv、xml等
- 自动处理编码
- 可自定义扩展
爬取步骤如图
3.2、安装
pip install scrapy 检测是否安装成功:scrapy bench 使用步骤:
-
创建工程 -
定义Item,构造爬取的对象(可选) -
编写爬虫主体 - 使用BeautifulSoup解析网页内容 - 调用自制的Item -
编写配置和管道,用于处理爬虫结果(可选) -
执行爬虫
scrapy startproject tutorial
cd tutorial
scrapy genspider aqi_spider http://www.pm25.in/
使用Pycharm打开创建的工程并打开对应的Spyder文件,编辑想要输出的代码
scrapy crawl api_spider
含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中配置信息。 添加open_spider()函数,close_spider()函数 通过scrapy crawl api_spider语句运行文件后会在目录中产生一个cities.csv文件
|