爬虫抓取网页数据(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 应运而生。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线