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 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 创新项目实训:数据爬取 -> 正文阅读

[人工智能]创新项目实训:数据爬取

数据爬取

爬虫简介:
网络爬虫是编写脚本来模拟浏览器,向网站服务器发出请求,让服务器返回网页信息,然后解析网页并提取需要的数据保存。

爬取目标:宝可梦主页链接

爬取结果:
在这里插入图片描述

爬取实现:代码如下:

import os
import pandas as pd
import requests

#第一步:获取所有宝可梦的编号和名字

#爬虫优化,超时重试
def get_html(url):
    i = 0
    #最多重连5次
    while i <= 5:
        try:
            #最大连接等待时间30秒,最大响应等待时间60秒
            resp = requests.get(url,timeout=(30,60))
            resp.encoding = 'utf-8'
            return resp
        except requests.exceptions.RequestException:
            i += 1
            print('超时{}次'.format(i))

#生成宝可梦列表(按全国图鉴编号)简单版页面后,可以注释这段代码,然后需要对data.html进行部分修改(下面会提及)
#url = 'https://wiki.52poke.com/wiki/宝可梦列表(按全国图鉴编号)/简单版'
#data = get_html(url)
#f = open('C:/Users/dell/PycharmProjects/pythonProject1/helloworld/HTML/data.html','w',encoding='utf-8')
#data.encoding='utf-8'
#f.write(data.text)
#f.close()

#读取data.html,获取完善的编号和名字
import re
f = open('C:/Users/dell/PycharmProjects/pythonProject1/helloworld/HTML/data.html','r',encoding='utf-8')
#data.html的读取
data_html = f.read()
f.close()

#只获取编号和名字,多余内容过滤
data_html = data_html.split('<td>#001')[1]
data_html = data_html.split('Enamorus</a>')[0]
data_html = '<td>#001' + data_html + 'Enamorus</a>'

#编号
ids = re.findall('<td>#(.*?)\n</td>',data_html)
#名字
names = re.findall('title="(.*?)"',data_html)
#去掉世代
def func(s):
    return not '世代' in s
names = list(filter(func,names))

#第二步:爬取各宝可梦的页面,获取其属性、特性等

#数据写进列表里
l = []
#遍历ids,生成各宝可梦html,再各自爬取
for i in range(len(ids)):
    #每只宝可梦数据写入字典中
    D_data = {}

    D_data['id'] = ids[i]
    D_data['中文名'] = names[i * 3]
    D_data['日文名'] = names[i * 3 + 1]
    D_data['英文名'] = names[i * 3 + 2]
    print(D_data)

    html = ''
    # 判断若存在ids号的html,打开读取
    if os.path.exists('C:/Users/dell/PycharmProjects/pythonProject1/helloworld/HTML/{}.html'.format(ids[i])):
        f = open('C:/Users/dell/PycharmProjects/pythonProject1/helloworld/HTML/' + ids[i] + '.html', 'r', encoding='utf-8')
        html = f.read()
        f.close()
    # 若不存在,生成ids号的html
    else:
        url = 'https://wiki.52poke.com/wiki/' + D_data['中文名']
        resp = get_html(url)
        f = open('C:/Users/dell/PycharmProjects/pythonProject1/helloworld/HTML/' + ids[i] + '.html', 'w', encoding='utf-8')
        resp.encoding = 'utf-8'
        f.write(resp.text)
        html = resp.text
        f.close()

    #正则表达式,获取属性
    type = re.findall('title="(.*?)(属性)">', html)
    print(type)
    D_data['属性1'] = type[0]
    D_data['属性2'] = len(type) > 1 and type[1] or ''

    if len(D_data['属性1']) > 5 or D_data['属性1'] == '':
        D_data['属性1'] = D_data['属性2']
    if len(D_data['属性2']) > 5 or D_data['属性2'] == '':
        D_data['属性2'] = D_data['属性1']

    try:
        #开始无法获取,列表为空的时候跳过
        skill = re.findall('title="(.*?)(特性)">', html)
        print(skill)
        D_data['特性1'] = skill[0]
        D_data['特性2'] = len(skill) > 1 and skill[1] or ''
        if len(D_data['特性2']) > 5 or D_data['特性2'] == '':
            D_data['特性2'] = D_data['特性1']
        D_data['特性3'] = len(skill) > 2 and skill[2] or ''
        if len(D_data['特性3']) > 5 or D_data['特性3'] == '':
            D_data['特性3'] = D_data['特性2']

        D_data['HP'] = re.findall('title="HP">HP</a>:</div><div style="float:right">(.*?)</div>', html)[0]
        D_data['攻击'] = re.findall('title="攻击">攻击</a>:</div><div style="float:right">(.*?)</div>', html)[0]
        D_data['防御'] = re.findall('title="防御">防御</a>:</div><div style="float:right">(.*?)</div>', html)[0]
        D_data['特攻'] = re.findall('title="特攻">特攻</a>:</div><div style="float:right">(.*?)</div>', html)[0]
        D_data['特防'] = re.findall('title="特防">特防</a>:</div><div style="float:right">(.*?)</div>', html)[0]
        D_data['速度'] = re.findall('title="速度">速度</a>:</div><div style="float:right">(.*?)</div>', html)[0]

    except IndexError:
        pass
        
#第三步:将爬取到的数据写入BKM.csv文件中
    l.append(D_data)
    df = pd.DataFrame(l)
    df.to_csv('C:/Users/dell/PycharmProjects/pythonProject1/helloworld/HTML/BKM.csv')

爬取中遇到的问题及解决

AttributeError: ‘NoneType’ object has no attribute ‘encoding’

首先在过滤掉多余的内容只获取编号和名字,再通过中文名字获取每个宝可梦角色的网页,最后以其编号命名形式生成各自的html。

在生成到649.html后停止,报错:AttributeError: ‘NoneType’ object has no attribute ‘encoding’。

解决办法是将代码中的resp.encoding = 'utf-8'改为resp.encoding = 'utf8'

成功执行,如图:
在这里插入图片描述

IndexError: list index out of range

获取完html后,再通过保存下来的各个宝可梦html去爬取宝可梦的特性、属性等

但无法执行,报错:IndexError: list index out of range,如图:
在这里插入图片描述

解决步骤是:
1.调试,打印print(skill),发现是空列表;
2.利用try:
		代码段     
	except IndexError:
		pass
测试;

部分结果如图:
在这里插入图片描述
我们发现第一行数据为空,说明001.html并没有爬取到我们的数据;经比较法发现,生成的001.html不对。

#删除001.html,重新写入:
import requests
url = 'https://wiki.52poke.com/wiki/妙蛙种子'
resp = requests.get(url)
f = open('C:/Users/dell/PycharmProjects/pythonProject1/helloworld/HTML/' + '001' + '.html', 'w',encoding='utf-8')
resp.encoding = 'utf-8'
f.write(resp.text)
html = resp.text
f.close()

问题成功解决。执行到649.html停止,报错:IndexError: list index out of range
在这里插入图片描述
按上述经验查找649.html,发现为空(可能跟第一个问题有些关联)
在这里插入图片描述
按上述经验再次生成649.html

import requests
url = 'https://wiki.52poke.com/wiki/盖诺赛克特'
resp = requests.get(url)
f = open('C:/Users/dell/PycharmProjects/pythonProject1/helloworld/HTML/' + '649' + '.html', 'w',encoding='utf-8')
resp.encoding = 'utf-8'
f.write(resp.text)
html = resp.text
f.close()

成功执行,部分结果如图:
在这里插入图片描述

宝可梦大葱鸭的英文名读取错误

后来在爬取宝可梦图片中发现,083.png并不能显示出来。经发现英文名不符,实际上是:Farfetch’d

而结果是:
在这里插入图片描述

单引号(’)的字符实体是&#39。ASCII是用来表示英文字符的一种编码规范。要使ASCII编码表所对应的字符被浏览器识别,就需要使用到HTML字符实体。

解决方法:
打开data.html,在041行中将 title=”Farfetch’d” 改为 title=”Farfetch’d”。删除BKM.csv,同时在重新运行时,要注释生成data.html的代码。

在这里插入图片描述
在这里插入图片描述
csv文件结果如图:
在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-06-01 15:13:42  更:2022-06-01 15:14:15 
 
开发: 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/26 4:26:54-

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