页面 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']

本文转载:CSDN博客