20202216 2020-2021-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2022
姓名: 邓童丹
学号:20202216
实验教师:王志强
实验日期:2021年6月14日
必修/选修: 公选课
批阅:注意本次实验不算做实验总分,前三个实验每个实验10分,累计30分。本次实践算入综合实践,打分为25分。
评分标准:
(1)程序能运行,功能丰富。(需求提交源代码,并建议录制程序运行的视频)10分
(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。10分。
(3)在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。5分
右键选择检查,打开浏览器的调试功能,选择 Network 菜单,Ctrl+R刷新获取数据
注意到Name栏里的倒数第二行,复制它的link address下来后是这样的
这是微博移动端api,可以在此进行json数据的获取和提取
cardlistInfo是列表信息
cards是当前页面的编号
用户的特定containerId等于107603+UID
total是总微博数
card_type正常为9
ok: 1就表明获取页面信息成功
pic是我要找的图片信息,这在mblog下,我主要需要获取图片的id和url
大概知道要爬取的内容和信息位置后,开始写代码
构建请求头,并随便找个移动端设备的用户代理
host = 'm.weibo.cn' base_url = 'https://%s/api/container/getIndex?' % host user_agent = 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 wechatdevtools/0.7.0 MicroMessenger/6.3.9 Language/zh_CN webview/0' # 在网上随便找个user_agent user_id = str(5886339293) # 这里填写用户id headers = { 'Host': host, 'Referer': 'https://m.weibo.cn/u/%s' % user_id, 'User-Agent': user_agent }
导入模块,有些模块没有安装,还需要先安装好
import requests import urllib.request import time import os from tqdm import tqdm from urllib.parse import urlencode
编写一个函数用于对网页进行请求
def get_single_page(page): params = { 'type': 'uid', 'value': 1665372775, 'containerid': int('107603' + user_id), 'page': page } url = base_url + urlencode(params) try: response = requests.get(url, headers=headers) if response.status_code == 200: return response.json() except requests.ConnectionError as e: print('爬取失败', e.args)
此函数解析页面返回的json数据
def analysis_page(json, pic_filebagPath): items = json.get('data').get('cards') for item in items: item = item.get('mblog') if item: if pic_choice == 'y': pics = item.get('pics') if pics: for pic in pics: picture_url = pic.get('large').get('url') # 得到原图地址 pid = pic.get('pid') # 图片id pic_name = pid[25:] download_pics(picture_url, pic_name, pic_filebagPath)
此函数用于保存图片到本地
def download_pics(pic_url, pic_name, pic_filebagPath): pic_filePath = pic_filebagPath + '\\' try: f = open(pic_filePath + str(pic_name) + ".jpg", 'wb') response = urllib.request.urlopen(pic_url) f.write(response.read()) f.close() except Exception as e: print(pic_name + " error", e) time.sleep(0.1)
主函数部分
if __name__ == '__main__': base_data = {} page = input('输入要爬取的页数') # 输入爬取页数,输入‘all’即爬取所有微博 pic_choice = input('是否开始存储图片?y/n') time_start = time.time() try: json = get_single_page(1) screen_name = json.get('data').get('cards')[0].get('mblog').get('user').get('screen_name') total = json.get('data').get('cardlistInfo').get('total') if pic_choice == 'y': pic_filebagPath = 'D:\\weibopachong\\%s_picture' % screen_name os.makedirs(pic_filebagPath) # 建立文件夹 else: pic_filebagPath = None if page == 'all': page = total // 10 while get_single_page(page).get('ok') == 1: page = page + 1 print('总页数为:%s' % page) page = int(page) + 1 for page in tqdm(range(1, page)): # 抓取数据 json = get_single_page(page) analysis_page(json, pic_filebagPath) except Exception as e: print('error:', e) finally: time_end = time.time() print('\n total cost', time_end - time_start)
运行结果
图片保存到本地后
源码放到码云