不知道这里有多少球迷,又有多少人知道“懂球帝”这个网站,今天我们的爬虫目标就是“懂球帝”的女神大会板块,开始吧。
老规矩,还是先给出代码:
数据爬取
获取 ID 信息
首先我们可以通过抓取懂球帝 App 的网络请求,拿到一个 API(具体如何做 App 抓包,可以在网络上查询下):
http://api.dongqiudi.com/search?keywords=type=all&page=
我们使用 Postman,来查看下该 API 的返回数据是怎样的:
可以看到,通过键入不同的 keywords,API 可以返回不同的信息,我们通过搜索“女神大会”,并从返回结果中获取 ID、URL 和 thumb 即可。
ID 后面用来拼接女神所在页面的 HTML 地址;而 thumb 则是女神的封面照片,收藏吧。
接下来,我们就可以根据该 API 的请求和响应,写一个抓取全部女神信息的函数:
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
代码还是比较简单的,循环请求 API 地址,并把 ID 和 thumb 保存到列表当中。
下载 HTML 页面
下面我们打开“懂球帝”网站,可以看出,每一个页面,都是由如下规律的页面组成的:
http://www.dongqiudi.com/news/****
而 news 后面接的就是我们上一步拿到的 ID 信息,比如我们拿到“刘岩”的 ID 为 813611,那么访问地址:
http://www.dongqiudi.com/news/813611
我们就来到了刘岩所在的页面。
并且,每个页面都会有前一期女神的得分情况,这个也是我们要关注的。
现在我们已经知道了网页地址的组成规律,那么就可以写函数,来下载网页到本地了。
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 数据的。
cookies 和 headers 配置如下: