基于Python 的网络爬虫技术
2020-09-11四川水利职业技术学院赵文杰古荣龙
四川水利职业技术学院 赵文杰 古荣龙
随着互联网技术的快速发展和大数据时代的到来,网络数据呈爆炸式的发展,如何从海量的数据中快速高效地提取用户感兴趣的Web 信息,在大数据处理中面临着巨大的挑战。虽然目前通过搜索引擎可以满足日常基本的需求,但对特定的内容不能进行集中处理和可视化展示。另外,手动搜索的效率低,对数据选取的时间成本较高。网络爬虫技术可以很好地解决这种问题,自行定制规则选取特定内容,可以让我们更精准地获取有效数据。同时网络爬虫可以根据网页内容进行深度和广度搜索,实现自动化运行[1]。
1 爬虫技术
网络爬虫,是按照设定的规则自动抓取网络信息的程序。网页中包含了文字信息、超链接信息。从功能上来讲,爬虫的处理过程一般包括数据采集、处理、储存三个部分。在网络爬虫的系统框架中,主过程由控制器、解析器、资源库三部分组成。控制器的主要工作是负责给多线程中的各个爬虫线程分配工作任务。解析器的主要工作是下载网页,进行页面的处理,主要是将一些JS 脚本标签、CSS 代码内容、空格字符、HTML 标签等内容处理掉,爬虫的基本工作由解析器完成。资源库用来存放下载到的网页资源,一般都采用大型的数据库存储[2]。
网络爬虫技术分为以下几类:通用网络爬虫、聚焦网络爬虫、增量网络爬虫、深层网络爬虫[3]。这几种爬虫的关键技术是类似的。爬虫获取网络数据的方式:模拟浏览器发送请求,获取网页代码——提取有用数据,解析内容,保存数据。
2 Python 简述
Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。它是解释型语言,但是也可以编译成.pyc 跨平台的字节码文件。.pyc 文件有几个好处:一是可以简单地隐藏源码,二是提高载入速度,三是跨平台。相较于C++、Java 语言,Python 更易于学习,有一个广泛的标准库。同时可以结合Java 或C/C++语言,封装成Python 可以调用的扩展库,便于扩展和移植。Python 提供了非常丰富的针对网络协议的标准库,能简单高效地进行网页抓取、网页解析、数据存储等,使程序员可以集中精力处理程序逻辑[4]。
3 爬虫案例
本文通过Python 语言来实现一个简单的聚焦型爬虫,爬取当当网上的图书信息,将图书的封面图片,图书书名、图书链接页面保存在本地csv 文件中。本文在Python3.6 环境下调试完成。
该系统主要由三个方面构成。第一,Url 管理器,负责提取网络的url 地址。第二,网页下载器,从网络上下载网站内容,获取页面中详细信息;第三,页面解析器,针对网页下载器中的信息,提取目标信息;第四,数据存储器,完成数据持久化。
具体实现过程如下:
(1)打开当当网页面,搜索关键字“Python”,结果如图1 所示。
图1 搜索结果图
(2)分析源代码,可利用开发者工具查看每个数据对应的元素及class 名称,如图2 所示。
图2 网页源代码
(3)对网页进行解析,可以使用正则表达式、BeautifulSoup、lxml 等多种方式来解析网页,每种方法各有特色,使用时结合实际需要选择一种适合的解析方法。
#导入程序需要的库
import urllib.request
import time
import csv
import codecs
from bs4 import BeautifulSoup
#打开网页,输入关键字”python”
图3 保存在csv 文件中的数据
#爬取地址,当当Python 的书籍太多,我们只爬取前20 页的信息
url="http://search.dangdang.com/?key=python&act=input&s how=big&page_index="
#请求头
headers={'
User-Agent':'Mozilla/5.0 (Windows NT 6.1;Win64;x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
index=1
while index<=20:
#发起请求
request = urllib.request.Request (url=url+str (index),headers=headers)
response=urllib.request.urlopen(request)
index=index+1
#通过BeautifulSoup 的find_all 方法解析页面
soup=BeautifulSoup(response)
temps=soup.find_all('a',class_='pic')
global books
books=books+temps
(4)数据持久化,将爬取的数据保留在本地。数据存储的方式方法有多种,可以保留在普通文件中,如txt、csv 等。也可以存储在数据库中,如MySQL。本文将爬取到的数据写入csv 文件,结果如图3 所示。代码如下:
file_name='PythonBook.csv'
#指定编码为utf-8,避免写csv 文件出现中文乱码
with codecs.open(file_name,'w','utf-8')as csvfile:
filednames=['书名','页面地址','图片地址']
writer=csv.DictWriter(csvfile,fieldnames=filednames)
writer.writeheader()
for book in books:
if len(list(book.children)[0].attrs)==3:
img=list(book.children)[0].attrs['data-original']
else:
img=list(book.children)[0].attrs['src']
try:
writer.writerow({' 书名':book.attrs['title'], ' 页面地址':book.attrs['href'],'图片地址':img})
except UnicodeEncodeError:
print("编码错误,该数据无法写到文件中")
4 结语
本文介绍了基于Python 的网络爬虫技术的工作流程,以实际案例演示了当当网数据的爬取过程。现在已经进入大数据时代,网络爬虫技术具有极高的实际应用价值,作为一种自动收集数据的手段,在各行各业都有广泛的应用。同时也能为后续数据处理、数据分析做好准备。