今天的公开课讲的是英雄联盟传记的爬取。
–爬取了英雄联盟的所有人物的"name,slug,release,associated",分别是名字,英文名字,创建日期以及国籍
–保存到lol.csv文件中
–再读取这个文件,利用里面的slug参数和获取英雄传记的地址结合
–for循环遍历所有英雄的传记故事,利用etree去掉<p>标签,利用join()函数来连接字符串数组,最后将再写入到lol.txt文件中,形成一本传记集。
1.最简单的爬取,用 requests发送post请求并获取json数据,(网站有反爬取的话就不行)
import requests #爬取数据的库
url = 'https://yz.lol.qq.com/v1/zh_cn/search/index.json' #这个是网址
response = requests.get(url) #爬取数据(或者叫下载数据)
data = response.json() #获取json数据
2.打开文件使用相对路径,并且声明是utf-8编码的方式(不然有可能出错)
with open('../file/lol.csv','w',encoding='utf-8') as file: #两个点..代表上一层目录,如果想用当前目录就用一个点.
................................
3.拼接字符串f‘’,也叫做格式化操作或者插值运算符,与可以可以参考其他的方法
file.write(f'\n{name},{slug},{release},{associated}') #将多个变量值以特定格式来输出,也叫做格式化
4.csv数据的读取以及提取某一列数据
#先打开csv文件,在使用 csv.DictReader()来将一个csv数据加载为一个字典(有表头的文件建议加载为字典)
#将字典里面的slug一列提取出来
with open('../file/lol.csv',encoding='utf-8') as file_csv:
reader = csv.DictReader(file_csv)
slug = [r['slug'] for r in reader] #列表推导式,相当于下面的三行注释
#slug = []
#for r in reader:
# slug.append(r['slug'])
5.将字典中所有的”值“提取出来
contenthtml = ""
for c in biography.values():
contenthtml +=c
6.利用etree.HTML()加载字符串内容,构造了一个XPath解析对象,并且拿<p>标签下面所有的数据(从而去掉<p>标签)
#etree.HTML():构造了一个XPath解析对象并对HTML文本进行自动修正。
html = etree.HTML(contenthtml) #解析HTML文档
content = html.xpath("//p/text()") #去掉<p>标签
7.利用join()连接字符串
# 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串;
f.write('\n'.join(content)+"\n\n") # 以换行符\n来组合列表,使多个列表变成一个完整的
下面是完整代码:
#对herosoider.py和bataspider.py结合在一起
import requests #爬取数据的库
import csv #csv操作库
from lxml import etree #可以将一些文本转换为html,方便进行增删操作。
url = 'https://yz.lol.qq.com/v1/zh_cn/search/index.json'
response = requests.get(url)
data = response.json()
with open('../file/lol.csv','w',encoding='utf-8') as file:
file.write("name,slug,release,associated") #写入一个表头
for d in data['champions']:
name = d['name']
print(name)
slug = d["slug"]
release = d['release-date']
associated = d['associated-faction-slug']
file.write(f'\n{name},{slug},{release},{associated}')
with open('../file/lol.csv',encoding='utf-8') as file_csv:
reader = csv.DictReader(file_csv)
slug = [r['slug'] for r in reader]
#slug = []
#for r in reader:
# slug.append(r['slug'])
with open('../file/lol.txt','w',encoding='utf-8') as f:
for i,s in enumerate(slug):
url = f"https://yz.lol.qq.com/v1/zh_cn/champions/{s}/index.json"
response = requests.get(url)
data = response.json()
name = data['champion']['name']
title = data['champion']['title']
biography = data['champion']['biography']
contenthtml = ""
for c in biography.values():
contenthtml +=c
#etree.HTML():构造了一个XPath解析对象并对HTML文本进行自动修正。
html = etree.HTML(contenthtml) #解析HTML文档
content = html.xpath("//p/text()") #去掉<p>标签
f.write(f'第{i+1}节 {name}-{title}\n')
f.write('\n'.join(content)+"\n\n") # 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串;
# 以换行符来组合列表,使多个列表变成一个完整的