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