IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python小记(3) | 爬取微博页面存储为html到本地&提取关键词存入excel -> 正文阅读

[Python知识库]python小记(3) | 爬取微博页面存储为html到本地&提取关键词存入excel


因为最近事情稍微多了些,又正好上第二节课,索性将两次课内容合并在一起(第二节课是被bug强制卡下课的悲惨小欣)/(ㄒoㄒ)/~~

一、基本思路

  1. 新建文件夹用于存储爬取下来的数据,设置关键词(例如“眷思量”),爬取多页,构造客户代理池,爬取页面存为html文件格式;
  2. 读取关键词命名文件夹下的所有文件,提取html文件中我们需要的具体分析的关键词内容(用户名、发表时间、转赞评数目、内容),存入关键词命名的表格。

二、代码详解

涉及到的库:jsonxlwtosrequestsurllib.parsere,前三个以前介绍了,见这篇文章数据分析与挖掘常用库,后面三个这里放一下简要介绍:

1. requests

Python第三方库,公认爬取网页最好的库,代码里主要用到requests.get(),其语法为res=requests.get(url,headers=headers,params,timeout)
url:要抓取的 url 地址。
headers:用于包装请求头信息。
params:请求时携带的查询字符串参数。
timeout:超时时间,超过时间会抛出异常。

Requests库主要有7个方法,分别是
1.requests.request():构造一个请求,支撑以下各方法的基础方法
2.requests.get():获取HTML网页的主要方法,对应于HTTP的GET
3.requests.head():获取HTML网页头信息的方法,对应于HTTP的HEAD
4.requests.post():向HTML网页提交POST请求的方法,对应于HTTP的POST
5.requests.put():向HTML网页提交PUT请求的方法,对应于HTTP的PUT
6.requests.patch():向HTML网页提交局部修改请求,对应于HTTP的PATCH
7.requests.delete():向HTML页面提交删除请求,对应于HTTP的DELETE

使用 Requests 模块向一个 URL 发起请求后会返回一个 HttpResponse 响应对象,该对象具有以下常用属性。
在这里插入图片描述
特殊方法也就是我们代码中用到的json
r.json() #Requests中内置的JSON解码器,方便处理json数据
r.raise_for_status() #失败请求(非200响应)抛出异常

2. urllib.parse urlencode()

urllib是一个收集了多个用到URL的模块的包,urllib.parse用于解析URL,该模块定义了一个标准接口,用于URL字符串按组件(协议、网络位置、路径等)分解,或将组件组合回URL字符串,并将 “相对URL “转换为给定 “基础URL “的绝对URL,解析内容如下图所示。urlencode()将字典转换为字符串。
在这里插入图片描述

3. re

提供了与 Perl 语言类似的正则表达式匹配操作(Perl借取了C、sed、awk、shell 脚本语言以及很多其他程序语言的特性。其中最重要的特性是它内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN)。
正则表达式语法规则(我记不住,感觉好难!)
辅助函数(用来检测或显示匹配对象)

def displaymatch(match):
	if match is None:
		return None
	return'<Match: %r, groups=%r>'%(match.group(),match.groups())

基于 re.match() 检查字符串开头,或者 re.search() 检查字符串的任意位置(默认Perl中的行为)。

re.match("c", "abcdef")    # No match
re.search("c", "abcdef")   # Match
# return <_sre.SRE_Match object; span=(2, 3), match='c'>

4. 数据爬取存入文件夹

base_url = 'http://m.weibo.cn/api/container/getIndex?'
keyword = input('输入关键词')
# 获取当前路径
path = os.getcwd()
print(path)
# 在当前路径下以输入关键词为名创建新文件夹
mkpath = os.path.join(path,keyword)
#获取此py文件路径,在此路径选创建在new_folder文件夹中的test文件夹
if not os.path.exists(mkpath):
    os.mkdir(mkpath)

# 提取2-15页内容
for i in range(2,15):
    params = {
        'containerid':'100103type=1&q={}&t=0'.format(keyword),
        'page': i,
        'count': 5
    }
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"
    }
    params = urlencode(params)  # (注意param要用urlencode()转换)
    url = base_url + params     # 将base_url 和params拼接成最终的url
    r = requests.get(url=url,headers=header).json() 
    path_html = os.path.join(mkpath,'{}_{}.html'.format(keyword,i))
    # 网页以“关键字_页码.html”命名存储网页文件
    with open(path_html,'w',encoding='utf-8') as f:
        f.write(json.dumps(r,ensure_ascii=True))
    print('Page {}  download  finish!'.format(i))

输入关键词眷思量(是的,我就是那个为爱发电、到处给人种草的眷粉,我打算之后对眷眷超话做一次数据分析,啊,不知道能不能被导演姐姐pick?),生成文件夹,打开可以看到
在这里插入图片描述
html里面是这样的,乱中有序,我是把它想象成一个鸡蛋,一层套一层,而且类似于字典排布(最近,好像正好在准备《信息简史》第三章讨论,就是关于字典!),我们用[’’][’’]就能方便的读取内容了。
在这里插入图片描述

5. 关键词内容存入excel

filename = os.listdir(path)

# 创建6个空列表放
all_screen_name = []  # 创建用户名列表
all_created_at = []  # 创建发布时间列表
reposts_count = []  # 创建转发数列表
comments_count = []  # 创建评论数列表
attitudes_count = []  # 创建点赞数列表
text = []  # 创建微博内容列表


print(filename)
xls = xlwt.Workbook(encoding='utf-8')
sht1 = xls.add_sheet("sheet1",True)
for i in filename:

    path_i = path+'/'+i
    f = open(path_i,'r',encoding='utf-8')

    readfile = f.read()
    result = json.loads(readfile,strict=False)
    print(result)
    items = result['data']['cards']
    for item in items:
        all_created_at.append(item['mblog']['created_at'])
        ··· # 其余类似
    # 添加表格

    # 添加字段
    sht1.write(0,0,'num')
    sht1.write(0,1,'all_screen_name')
    ··· # 其余类似

    for i in range(1,len(all_screen_name)):
        sht1.write(i, 0, i)  # 注意是从表格第1行,不是第0行开始排列,同时读取列表是从第0个开始读取
        sht1.write(i, 1, all_screen_name[i-1])
        ··· # 其余类似

xls.save('./法治社会.xls')  # 开始以为眷思量编码不同,就听朋友建议,换了法治社会,觉得一定不会屏蔽哈哈哈

结果像这样(请认真阅读红线部分哈哈哈,没错,世另我了)
在这里插入图片描述

三、问题记录

数据爬取阶段,我先通过Python Console测试是否获取当前路径,并打印当前路径,同时测试爬取一页的结果,显示没有问题。之后我运行程序,发现我建好的文件夹中没有html文件!!!一顿查找,终于发现了是因为Python Console和shujupaqu.py文件不在同一个路径下方,因此新建的“眷思量”文件夹也不一样!,打开./venv(实际所在文件路径),果然发现了html文件的文件夹。

关于venv
(我也不清楚是什么时候装的,之前用scrapy做过图片网站的爬取,可能是看参考书设置的。)具体来说,venv一个虚拟出来的环境。通俗的来讲,这个虚拟的环境可以理解为一个“容器”,在这个容器中,可以只安装我们需要的依赖包,而且各个容器之间互相隔离,互不影响。这样也就更方便使用python2和python3了。

VirtualEnv可以搭建虚拟且独立的python运行环境, 使得单个项目的运行环境与其它项目独立起来。同时也可以用于在一台机器上创建多个独立的python运行环境,VirtualEnvWrapper为前者提供了一些便利的命令行上的封装。
Virtualenv是一个非常好的virtual python environment builder,它最大的好处是,可以让每一个python项目单独使用一个环境,而不会影响python系统环境,也不会影响其他项目的环境。
Virtualenv可用于创建独立的Python环境,在这些环境里面可以选择不同的Python版本或者不同的Packages,并且可以在没有root权限的情况下在环境里安装新套件,互相不会产生任何的影响。

数据预处理阶段,其实也没怎么找出原来的错误在哪里(憨憨挠头),当时运行程序报错大概是这个地方raise JSONDecodeError(“Expecting value”, s, err.value) from None,这里第一次我在json.load里卖面添加了strict=False属性,但是单改这个没有用。第二次我开始尝试了别人成功运行的代码仅仅更改路径,也没有解决问题。后来换了关键词“法治社会”,莫名其妙就过了,后面更改的地方就是小修一下items和item具体的关键词名称(我少打了cards的s)和表单循环(我竟然之前生成了66个表格哈哈哈)。换关键词成功生成表单之后,我又一次尝试眷思量,嗯,成功了。

四、总结反思

总的来说,虽然代码总量肯定是很少的,但是很多东西我都不了解,正好这段时间在准备考一下C1认证,对于HTTP协议、Web基础和JAVA要求都还比较基础(对我来说还是有点困难),这段时间会记录一下学习过程和总结反思,尽快实现眷思量超话分析目标!加油!

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-03 17:02:17  更:2021-10-03 17:03:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:07:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码