页面 ID 信息获取
不过这里有一个问题,以前的懂球帝是带有搜索功能的,所以我们能从搜索功能中找到一个用于搜索的 API,但是现在该功能不见了,所以这里已经没有办法展示如何拿到搜索 API 的过程了。
但是搜索 API 我们还是可以使用的:
http://api.dongqiudi.com/search?keywords=&type=all&page=
我们可以通过给 keyword 传入“女神大会”关键字,来获取到女神大会相关的信息:
- id 是对应的每个网页的 id;
- thumb 是女神的封面图片;
- url 对应的也是女神所在页面的地址信息。
于是,我们可以通过输入不同的 page 数值,获取到所有的 JSON 信息,并解析 JSON,保存我们需要的数据:
''' 更多Python学习资料以及源码教程资料,可以在群821460695 免费获取 ''' def get_list(page): nvshen_id_list = [] nvshen_id_picture = [] for i in range(1, page): print("获取第" + str(i) + "页数据") url = 'http://api.dongqiudi.com/search?keywords=%E5%A5%B3%E7%A5%9E%E5%A4%A7%E4%BC%9A&type=all&page=' + str(i) html = requests.get(url=url).text news = json.loads(html)['news'] if len(news) == 0: print("没有更多啦") break nvshen_id = [k['id'] for k in news] nvshen_id_list = nvshen_id_list + nvshen_id nvshen_id_picture = nvshen_id_picture + [{k['id']: k['thumb']} for k in news] time.sleep(1) return nvshen_id_list, nvshen_id_picture
下载 HTML 页面
我们把上面 API 拿到的 url 字段放到懂球帝的主地址下,拼接成如下 url:
http://www.dongqiudi.com/news/1193890
打开该 URL,发现确实是对应的详情页面:
我们观察该页面,发现球迷朋友们的评分都是展示在页面上的,且是上一期女神的评分,于是我决定把所有的 HTML 下载到本地,然后再慢慢解析页面,抽取数据:
def download_page(nvshen_id_list): for i in nvshen_id_list: print("正在下载ID为" + i + "的HTML网页") url = 'https://www.dongqiudi.com/news/%s' % i download = DownloadPage() html = download.getHtml(url) download.saveHtml(i, html) time.sleep(2) class DownloadPage(object): def getHtml(self, url): html = requests.get(url=url, cookies=config.session, headers=config.header).content return html def saveHtml(self, file_name, file_content): with open('html_page/' + file_name + '.html', 'wb') as f: f.write(file_content)
download_page 函数接收一个列表(就是上一个函数的返回值 nvshen_id_list),通过 requests 库来请求页面并保存至本地。同时为了方式请求过于频繁,做了 2 秒的延时等待设置。
这里还要注意一点的是,这里是设置了 cookies 和 headers 的,否则是无法拿到正常 HTML 数据的,headers 还是从浏览器中手动拷贝出来:
session = { 'dqduid': 'yours'} header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win32; x32; rv:54.0) Gecko/20100101 Firefox/54.0', 'Connection': 'keep-alive'}
解析 HTML
对于 HTML 的解析,我依旧使用 BeautifulSoup。主要需要获取 score 信息,但是由于好多 HTML 页面写的都不是很规则,故而这里耗费了比较多的时间。
对于得分情况,我是这么写的:
content.find_all('span', attrs={'style': "color:#ff0000"})
但是有些页面的规则不同,所以会存在无法解析一部分 HTML 文件,对于无法处理的文件,由于也不多,就手工处理了。
当然,感觉这里使用正则应该会好很多。代码过长,为了不影响阅读,就不贴出来了,可以到 GitHub 上查看
完整代码。
https://github.com/zhouwei713/data_analysis/tree/master/nvshendahui
def deal_loaclfile(nvshen_id_picture): files = os.listdir('html_page/') nvshen_list = [] special_page = [] for f in files: ... return nvshen_list, special_page def get_picture(c, t_list, n_id_p): nvshen_l = [] tmp_prev_id = c.find_all('a', attrs={"target": "_self"}) for j in tmp_prev_id: ...
有一部分 HTML 代码不是很规范,专门提出了这一部分:
w_list = ['吴宣仪', '30万', '826965', '68', '825847', 'https://img1.dongqiudi.com/fastdfs3/M00/74/54/180x135/crop/-/ChOxM1vIPpOAZT8AAAHza_WMyRk175.png'] g_list = ['关之琳', '20万', '813611', '88', '812559', 'https://img1.dongqiudi.com/fastdfs3/M00/6B/94/180x135/crop/-/ChOxM1u1gx2AZ7qmAABi3gRdHS8715.jpg'] t_list = ['佟丽娅', '22万', '797779', '93', '795697', 'https://img1.dongqiudi.com/fastdfs3/M00/60/A7/180x135/crop/-/ChOxM1ufUh2AJdR0AABXtcU22fg956.jpg'] y_list = ['杨丞琳', '7万', '1173681', '45', '1168209', 'https://img1.qunliao.info/fastdfs4/M00/CA/F7/ChMf8F0pTOKAaefqAA5nOMM0LK0171.jpg']
本文暂时没有评论,来添加一个吧(●'◡'●)