文章目录
-
- 网络爬虫基础
- 抓取静态网页数据
- 解析网页数据
- 抓取动态网页数据
- 存储数据
- 网络爬虫框架Scrapy
网络爬虫基础
-
网络爬虫概念:
-
网络爬虫(web Crawler)又称网络蜘蛛、网络机器人,它是一种按照一定规则,自动浏览万维网的程序或者脚本。
-
网络爬虫模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,主动地抓取互联网信息的程序,原则上,主要是浏览器(客户端)能做的事情,爬虫都能够做到。
-
网络爬虫分类:
-
网络爬虫历经几十年的发展,技术变得更加多样化,并结合不同的需求衍生出类型众多的领域。网络爬虫按照系统和实现技术大致可以分为4种类型,分别是通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。
-
网络爬虫的应用场景:
- 随着互联网信息的“爆炸”,网络爬虫渐渐为人们所知,病被应用到社会生活的众多领域。作为一种自动采集网页数据的技术,很多人其实并不清楚网络爬虫具体能应用到什么场景。
- 事实上,大多数依赖数据支撑的应用场景的离不开网络爬虫,包括搜索引擎、舆情分析与监测、聚会平台、出行类软件等。
-
表层网页和深层网页是互联网上的两种不同类型的网页。
1.表层网页是指传统搜索引擎可以索引的页面,主要是以超链接可以到达的静态网页构成的网页。这些网页的内容可以通过搜索引擎直接访问,不需要用户进行额外的操作或输入。
2.深层网页则是指大部分内容无法通过静态链接获取,只能通过用户提交一些关键词才能获取的网页。例如,用户注册后内容才可见的网页就属于深层网页。这些网页的内容可能隐藏在搜索表单之后,需要通过特定的操作或输入才能访问。
3.在网站中,深层网页的数量往往比表层网页的数量多得多。这是因为许多网站为了保护用户隐私、提供个性化服务或者增加用户体验,会设置一些深层网页。
4.需要注意的是,表层网页和深层网页并没有明确的界限,它们在某种程度上是可以相互转化的。例如,一个表层网页可以通过添加一些交互元素或动态内容,变成一个深层网页。同样地,一个深层网页也可以通过优化搜索引擎的索引和排名,变成一个表层网页。
抓取静态网页数据
在网站设计中,纯粹HTML格式的网页通常被称为静态网页。静态网站的特点是,所有的数据都呈现在网页的HTML源代码中。
-
什么是urllib库
- urllib库是内置的请求库,它可以看做是处理URL的组件集合。
-
快速使用urllib库
import urllib.request # 调用 urllib.request 库的 urlopen 方法,并传入一个 urlresponse = urllib.request.urlopen(http://www.baidu.com') #使用read 方法读取获取到的网页内容 html = response.read().decode('UTF-8) #打印网页内容 print(html)
1.Python2中使用的是urllib2 库来下载网页,该库的用法如下所示
import urllib2 response = urllib2.urlopen( http://www.baidu.com)
-
分析 urlopen 方法
- urlopen 方法可以接收多个参数,定义格式如下
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
参数如下
url-- 表示目标资源在网站中的位置; - data-- 用来指明向服务器发送请求的额外信息
- timeout--该参数用于设置超时时间,单位是秒
- context--实现SSL加密传输,该参数很少使用
-
使用 HTTPResponse 对象
#示例 import urllib.request response = urllib.request.urlopen(http://python.org') #获取响应信息对应的URL print(response.geturl()) #获取响应码 print(response.getcode()) #获取页面的元信息 print(response.info())
代理服务器(Proxy Server)是一种重要的服务器安全功能,它的工作主要在开放系统互联(OSI)模型的会话层,从而起到防火墙的作用。代理服务器大多被用来连接INTERNET(国际互联网)和INTRANET(局域网)。
解析网页数据
Python 中提供了多种解析网页数据的技术,包括正则表达式、XPath、Soup、JSONPath、
Beautiful。
- 正则表达式是一种文本模式,这种模式描述了匹配字符串的规则,用于检索字符串中是否有符合该模式的子串,或者对匹配到的子串进行替换正则表达式的优点是功能强大,应用广泛,缺点是只适合匹配文本的字面意义而不适合匹配文本意义。例如,正则表达式在匹配嵌套了 HTML内容的文本时,会忽略 HTML内容本身存在的层次结构,而是将HTML内容作为普通文本进行搜索。
拓展:二十大词云里正则表达式的作用
import collections # 词频统计库
import re
import jieba # 结巴分词
import matplotlib.pyplot as plt
import numpy # 数据处理库
import wordcloud # 词云展示库
from PIL import Image # 图像处理
# 读取文件
fn = open('二十大.txt', 'r', encoding='utf-8')
string_data = fn.read()
fn.close()
# 文本预处理
pattern = re.compile(r'\t|\n|\.|-|:|;|\(|\)|\?|"')
string_data = pattern.sub('', string_data)
print(string_data)
# 文本分词
seg_list = jieba.cut(string_data, cut_all=False)
list = [] # 根据jieba库对文章形成词列表
remove = [u'的', u'是', u'随着', u'我', u'我们', u'对', u'等'u'和', u'坚持', u'促进', u'重大', u'支持', u'上', u'基本',
u'和', u'加快', u'推动', u'能力', u'实施', u'不', u'要', u'在', u'以', u'完善', u'了', u'实现', u'一', u'为',
u'用',u'大', u'新', u'推进', u'全面', u',', u'、', u'。', u';', u'(', u')', u'“', u'”', u'!']
for word in seg_list:
if word not in remove:
list.append(word)
# 词频统计
wordcount = collections.Counter(list) # 筛选统计各个词的频率
word_count_top10 = wordcount.most_common(10) # 统计前10个最高频的词
print(word_count_top10)
# 词云展示
mask_bg = numpy.array(Image.open('bg2.jpg')) # 将PTL image转化成array
# 绘制词云
wordcloud_pic = wordcloud.WordCloud(
background_color='white',
mask=mask_bg,
max_words=200, #最大词语数
max_font_size=100, #最大字体
min_font_size=5, #最小字体
random_state=100, #随机配色方案
font_path='C:/Windows/Fonts/simkai.ttf' # simkai.ttf simfang.ttf
)
wordcloud_pic.generate_from_frequencies(wordcount) #
plt.imshow(wordcloud_pic)
plt.axis('off')
plt.show()
提示:若要解析纯文本,则可以选择正则表达式;若要解析HTML或XML格式的数据,则可以选择正则表达式、XPath 、 BeautifulSoup;若要解析JSON 格式的数据,则可以选择JSONPath为便于开发者使用这些技术,Python 提供了一些库或模块进行支持,包括re、lxml、bs4、jsonpath,其中re 模块支持正则表达式;lxml库和bs4库支持XPath;jsonpath 模块支持JSONPath 。
抓取动态网页数据
对于动态网页的数据可以直接使用模拟浏览器。运行的方式进行实现,这样做就可以不用管网页内部是如何使用JavaScript 渲染页面的,也不用管Ajax请求中到底有没有加密参数,在浏览器中看到是什么样的内容,抓取的结果便是什么样的内容。 Python 中提供了许多模拟浏览器 运行的库包Selenium、Splash、 PyAutoGUl等
- Selenium 是一个开源的、便携式的自动化测试工具,它最初是为网站自动化测试而开发的,Selenium 支持与所有主流的浏览器 (如Chrome、 Firefox、Edge、IE 等)配合使用,也包括诸如PhantomJS、Headless Chrome等一些无界面的浏览器。
存储数据
-
数据存储的方式
-
数据库存储:根据存储数据时所用数据模型的不同,当今互联网中的数据库主要分为两种:关系型数据库和非关系型数据库。
-
关系型数据库是指采用关系模型(二维表格形式)组织数据的数据库系统,它由数据表和数据表之间的关系组成,主要包含数据行、数据列、数据表、数据库4个核心元素非关系型数据库也被称为 NoSQL (Not Only SQL)数据库,是指非关系型的、分布式的数据存储系统。
-
与关系型数据库相比,非关系型数据库无需事先为要存储的数据建立字段,它没有固定的结构,既可以拥有不同的字段,也可以存储各种格式的数据
from pymongo import MongoClient
try:
# 准备前工作:连接-数据库-数据表
client = MongoClient("localhost", 27017) # 连接mongodb
database = client["db_student"] # 数据库存在,则直接访问db_student;否则创建db_student
collection = database["user"] # 集合存在,则直接访问user;否则创建user
# 具体操作
insertont = collection.insert_one({"name": "小明",
"age": "19"}) # 创建时候一定要有数据,否则创建不成功
insertont = collection.insert_one({"name": "小明", "age": "20"}) # 创建时候一定要有数据,否则创建不成功
insertont = collection.insert_one({"name": "小红", "age": "19"}) # 创建时候一定要有数据,否则创建不成功
except Exception as error:
print(error)