爬虫抓取网页数据(Python编程修改程序函数式编程的实战二抓取您想要的)
优采云 发布时间: 2022-03-01 21:14爬虫抓取网页数据(Python编程修改程序函数式编程的实战二抓取您想要的)
战斗一
抓取您想要的网页并将其保存到本地计算机。
首先我们简单分析下要编写的爬虫程序,可以分为以下三个部分:
理清逻辑后,我们就可以正式编写爬虫程序了。
导入所需模块
from urllib import request, parse
连接 URL 地址
定义 URL 变量并连接 url 地址。代码如下所示:
url = 'http://www.baidu.com/s?wd={}'
word = input('请输入想要搜索的内容:')
params = parse.quote(word)
full_url = url.format(params)
向 URL 发送请求
发送请求主要分为以下几个步骤:
代码如下所示:
# 重构请求头
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'
}
# 创建请求对应
req = request.Request(url=full_url, headers=headers)
# 获取响应对象
res = request.urlopen(req)
# 获取响应内容
html = res.read().decode('utf-8')
另存为本地文件
将爬取的照片保存到本地,这里需要使用Python编程文件IO操作,代码如下:
filename = word + '.html'
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
完整的程序如下所示:
from urllib import request, parse
# 1.拼url地址
url = 'http://www.baidu.com/s?wd={}'
word = input('请输入想要搜索的内容:')
params = parse.quote(word)
full_url = url.format(params)
# 2.发请求保存到本地
# 重构请求头
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'
}
# 创建请求对应
req = request.Request(url=full_url, headers=headers)
# 获取响应对象
res = request.urlopen(req)
# 获取响应内容
html = res.read().decode('utf-8')
# 3.保存文件至当前目录
filename = word + '.html'
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
尝试运行程序,进入RioTianの博客园,确认搜索,在当前工作目录下会找到“RioTianの博客园.html”文件。
函数式编程修饰符
Python函数式编程可以让程序的思路更清晰,更容易理解。接下来,利用函数式编程的思想,对上面的代码进行修改。
定义相应的函数,调用该函数执行爬虫程序。修改后的代码如下所示:
from urllib import request, parse
# 拼接URL地址
def get_url(word):
url = 'http://www.baidu.com/s?{}'
# 此处使用urlencode()进行编码
params = parse.urlencode({'wd': word})
url = url.format(params)
return url
# 发请求,保存本地文件
def request_url(url, filename):
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'
}
# 请求对象 + 响应对象 + 提取内容
req = request.Request(url=url, headers=headers)
res = request.urlopen(req)
html = res.read().decode('utf-8')
# 保存文件至本地
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
# 主程序入口
if __name__ == '__main__':
word = input('请输入搜索内容:')
url = get_url(word)
filename = word + '.html'
request_url(url, filename)
除了使用函数式编程,还可以使用面向对象的编程方式(实战二),后续内容会介绍。
第二幕
爬*敏*感*词*()页面,如Python爬虫,编程,只抓取贴吧的前5页。
确定页面类型
通过简单的分析可以知道,待爬取的*敏*感*词*页面是一个静态网页。分析方法很简单:打开*敏*感*词*,搜索“Python爬虫”,在出现的页面中复制任意一段。信息,例如“爬虫需要http代理的原因”,然后右键选择查看源,使用Ctrl+F快捷键在源页面搜索刚刚复制的数据,如下图:
从上图可以看出,页面中的所有信息都收录在源页面中,不需要单独从数据库中加载数据,所以页面是静态页面。
找出 URL 变化的规律性
接下来,查找要抓取的页面的 URL 模式。搜索“Python爬虫”后,贴吧的首页网址如下:
https://tieba.baidu.com/f?ie=utf-8&kw=python爬虫&fr=search
点击第二页,其url信息如下:
https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=50
点击第三页,url信息如下:
https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=100
再次点击第一页,url信息如下:
https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=0
如果还是不能确定,可以继续多浏览几页。最后发现url有两个查询参数kw和pn,pn参数有规律是这样的:
第n页:pn=(n-1)*50
#参数params
pn=(page-1)*50
params={
'kw':name,
'pn':str(pn)
}
url地址可以简写为:
https://tieba.baidu.com/f?kw=python爬虫&pn=450
编写爬虫
爬虫程序以类的形式编写,在类下编写不同的功能函数。代码如下:
程序执行后,爬取的文件会保存到Pycharm的当前工作目录下,输出为:
输入贴吧名:python爬虫
输入起始页:1
输入终止页:2
第1页抓取成功
第2页抓取成功
执行时间:12.25
以面向对象的方式编写爬虫程序时,思路简单,逻辑清晰,非常容易理解。上述代码主要包括四个功能函数,分别负责不同的功能,总结如下:
1) 请求函数
request函数的最终结果是返回一个HTML对象,方便后续函数调用。
2) 分析函数
解析函数用于解析 HTML 页面。常见的解析模块有正则解析模块和bs4解析模块。通过分析页面,提取出需要的数据,在后续内容中会详细介绍。
3) 保存数据功能
该函数负责将采集到的数据保存到数据库,如MySQL、MongoDB等,或者保存为文件格式,如csv、txt、excel等。
4) 入口函数
入口函数作为整个爬虫程序的桥梁,通过调用不同的函数函数实现最终的数据抓取。入口函数的主要任务是组织数据,比如要搜索的贴吧的名字,编码url参数,拼接url地址,定义文件存储路径。
履带结构
用面向对象的方式编写爬虫程序时,逻辑结构是比较固定的,总结如下:
# 程序结构
class xxxSpider(object):
def __init__(self):
# 定义常用变量,比如url或计数变量等
def get_html(self):
# 获取响应内容函数,使用随机User-Agent
def parse_html(self):
# 使用正则表达式来解析页面,提取数据
def write_html(self):
# 将提取的数据按要求保存,csv、MySQL数据库等
def run(self):
# 主函数,用来控制整体逻辑
if __name__ == '__main__':
# 程序开始运行时间
spider = xxxSpider()
spider.run()
注意:掌握以上编程逻辑将有助于您后续的学习。
爬虫随机休眠
在入口函数代码中,收录以下代码:
# 每爬取一个页面随机休眠1-2秒钟的时间
time.sleep(random.randint(1,2))
爬虫访问 网站 会非常快,这与正常的人类点击行为非常不符。因此,通过随机休眠,爬虫可以模仿人类点击网站,使得网站不容易察觉是爬虫访问网站,但这样做的代价是影响程序的执行效率。
焦点爬虫是一个执行效率低的程序,提高其性能是业界一直关注的问题。于是,高效的 Python 爬虫框架 Scrapy 应运而生。