实践刚学两天的python爬虫
乐乐课堂视频爬取
代码语言:javascript复制import re
from datetime import datetime
from os import error
from urllib import request, error
try:
page = 1
video_url = []
code = 0
file_number = 1
pages = 10
cid = 275359
for a in range(pages):
while True:
resp = request.urlopen("http://www.leleketang.com/let3/knowledge_list.php?cid={}&p={}".format(cid, page))
html = resp.read().decode("utf-8")
video_url = re.findall("http://. .mp4", html)
if len(video_url) != 0:
break
else:
video_url = []
print(video_url)
print("共有{}个视频正在下载".format(len(video_url)))
for img in video_url:
file_name = "/Users/yejizhi/Desktop/video/{}.mp4".format(file_number)
request.urlretrieve(img, file_name)
file_number = file_number 1
print("{}个视频已下载完成".format(len(video_url)))
video_url = []
page = page 1
except error.HTTPError as e:
print("error:{}".format(e.code))
流程图表示:
cid指的是服务器发送来的数据链接尾巴的一个变量
在网页中打开开发者工具Network可以获取到它
例如https://www.leleketang.com/let3/knowledge_list.php?cid=252843&p=1
尾巴的252843就是cid的值,每个年级每本教材都有一个对应的cid,可以直接替换
p为当前页码
在这个网页的源代码中可以找到mp4格式视频地址
所以代码中的cid和pages需要手动修改
pages指的是一共有多少页
有时间我再完善代码让它可以自动获取总页数
奥运会运动员信息爬取
这是我之前学习爬虫时的一个课堂作业
源代码如下:
代码语言:javascript复制import json
from urllib import request
import time,random
import csv
all_athlete = []
for page in range(1, 29):
url = "https://gw.m.163.com/olympic/2020/athleteList/chinaAllItem_{}.json".format(page)
resp = request.urlopen(url)
data = resp.read().decode("utf-8")
data_obj = json.loads(data) #json转python
athleteLst = data_obj["data"]["ul"]
for athlete in athleteLst:
d_url = "https://gw.m.163.com/olympic/2020/athlete/{}.json".format(athlete["athleteId"])
d_resp = request.urlopen(d_url)
d_data = json.loads(d_resp.read().decode("utf-8"))
#print(d_data)
athlete_info = d_data["data"]["athleteInfo"]
node = {}
node["name"] = athlete["athleteName"]
info_lst = athlete_info.split("#")
for info_item in info_lst:
item_data = info_item.split(":")
if item_data[0] == "姓名":
node["sex"] = item_data[1]
elif item_data[0] == "生日":
node["birthday"] = item_data[1]
elif item_data[0] == "项目":
node["item"] = item_data[1]
all_athlete.append(node)
print("=", end="", flush=True)
time.sleep(random.randint(1,3))
with open("/Users/yejizhi/Desktop/athlete.csv", "w", encoding = "utf-8", newline = "") as f:
field_name = ["name","sex","birthday","item"]
writer = csv.DictWriter(f, fieldnames = field_name)
for athlete in all_athlete:
writer.writerow(athlete)
print("爬虫结束")
原理是从云端发送来的json数据使用python爬虫下来再进行字符串分割保留需要的内容
写进csv表格文件里
athlete
马龙 | 1988.10.20 | 乒乓球 | |
---|---|---|---|
朱婷 | 1994.11.29 | 排球 | |
苏炳添 | 1989.8.29 | 田径 | |
谌龙 | 1989.1.18 | 羽毛球 | |
张常宁 | 1995.11.06 | 排球 | |
刘诗雯 | 1991.4.12 | 乒乓球 | |
范忆琳 | 1999.11.11 | 竞技体操 | |
吕小军 | 1984.7.27 | 举重 | |
谢文骏 | 1990.7.11 | 110米栏 | |
黄常洲 | 1994.8.20 | 跳远 | |
高兴龙 | 1994.3.12 | 跳远 | |
杜凯琹 | 1996.11.27 | 乒乓球 | |
王嘉男 | 1996.8.27 | 跳远 | |
张耀广 | 1993.6.21 | 跳远 | |
苏慧音 | 1998.4.13 | 乒乓球 | |
朱亚明 | 1994.5.4 | 三级跳远 | |
李皓晴 | 1992.11.24 | 乒乓球 | |
吴瑞庭 | 1995.11.29 | 三级跳远 | |
王宇 | 1991.8.18 | 跳高 | |
郑怡静 | 1992.2.15 | 乒乓球 | |
黄博凯 | 1996.9.26 | 撑杆跳高 | |
陈思羽 | 1993.8.1 | 乒乓球 | |
蔡泽林 | 1991.4.11 | 竞走 | |
郑先知 | 1993.4.18 | 乒乓球 | |
罗亚东 | 1992.1.15 | 竞走 | |
吕秀芝 | 1993.10.26 | 竞走 | |
…… | …… | …… |