是自动获取互联网信息的程序,用来对互联网信息进行分析、开发产品。
URL管理模块:对计划爬取或已经爬取的URL进行管理(已爬取不再爬取,未爬取则爬取,已失效网站检测等)
网页下载模块:将URL管理模块中指定的URL进行访问下载
网页解析模块:解析网页下载模块中的URL,处理或保存数据;若解析到需要继续爬取的URL,则返回URL管理模块继续循环。
上图介绍了爬虫的流程,是学习本节的基础。
防止重复爬取和循环指向
功能:
实现方式:
将URL对应的网页下载到本地或读入内存(字符串)
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
从已下载网页中解析所需内容
实现方式:
DOM(Document Object Model),文档对象模型
BeautifulSoup(
url,
html_parser 指定解析器
encoding 指定编码格式(和网页编码格式一致)
)
find(),找到第一个满足条件的节点
find_all(),找到所有满足条件的节点
方法:按照节点类型或属性查找(需要了解前端开发的部分知识)
查找节点返回的是Tag对象,获取Tag对象信息
【因为一个标签会有很多属性,所以返回的Tag对象是字典类型】
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') # 找到第一个链接新闻
开源的爬虫框架,用于爬取web站点并从页面中提取结构化数据,可用于数据挖掘,检测,自动化测试。
高级特性:
pip install scrapy
检测是否安装成功:scrapy bench
使用步骤:
创建工程
定义Item,构造爬取的对象(可选)
编写爬虫主体
- 使用BeautifulSoup解析网页内容
- 调用自制的Item
编写配置和管道,用于处理爬虫结果(可选)
执行爬虫
# (1)创建工程scrapy startproject 名字
scrapy startproject tutorial
# (2)编写Spyder
cd tutorial
scrapy genspider aqi_spider http://www.pm25.in/
# aqi_spider为自定义的spider名称
使用Pycharm打开创建的工程并打开对应的Spyder文件,编辑想要输出的代码
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中配置信息。
添加open_spider()函数,close_spider()函数
通过scrapy crawl api_spider语句运行文件后会在目录中产生一个cities.csv文件