1、前言
目前我的爬虫系列更新到了正则表达式,我们就可以用请求库+正则表达式爬取一些简单的页面了。因为我个人非常喜欢打篮球,所以就选取了虎扑网作为爬取对象。当然,这只是一个入门级案例,后面会再写一篇使用解析库的方式爬取虎扑网数据。
2、网站分析
想要爬取一个网站的数据,就一定要分析该网站的网页源代码。此时,通过浏览器登录虎扑网,点开NBA得分榜,完整网址为:虎扑网NBA得分榜。
目前得分榜第一位是马赛克队后卫,整个得分榜共有5页,237名球员。
通过点击第二页,第三页可以分析得知网址的构成为:https://nba.hupu.com/stats/players/pts/2、https://nba.hupu.com/stats/players/pts/3,变化的只有最后的页数,所以可以通过字符串拼接构造网址。然后点击f12查看源代码,发现球员数据均在一个类名为players_table的表格中,球员数据都在每一个tr中,但是由于第一行是行头,不需要爬进去,所以要注意把这一行排出去。
3、代码编写
首先,定义一个获取HTML的方法
def getHtml(pageNum):
'''
传入参数页数,获得该链接的HTML内容
:param pageNum: 页数
:return: HTML内容
'''
url = "https://nba.hupu.com/stats/players/pts/" + str(pageNum)
response = requests.get(url=url)
if response.status_code == 200:
return response.text
else:
return None
其次,定义正则表达式,使用re库的findall()获取所有符合正则表达式的内容
def getData():
pointList = [] # 定义一个列表存储数据
regExp = '<tr>.*?<a.*?>(.*?)</a>.*?<a.*?>(.*?)</a>.*?"bg_b">(.*?)<.*?</tr>'# 定义一个正则表达式,获取球员名称,球队和得分数据
for i in range(1,6):
html = getHtml(i)
# print(html)
results = re.findall(regExp,html,re.S)
for result in results:
pointList.append(result)
return pointList
输出结果为:
4、完整代码
import re
import requests
def getHtml(pageNum):
'''
传入参数页数,获得该链接的HTML内容
:param pageNum: 页数
:return: HTML内容
'''
url = "https://nba.hupu.com/stats/players/pts/" + str(pageNum)
response = requests.get(url=url)
if response.status_code == 200:
return response.text
else:
return None
def getData():
pointList = [] # 定义一个列表存储数据
regExp = '<tr>.*?<a.*?>(.*?)</a>.*?<a.*?>(.*?)</a>.*?"bg_b">(.*?)<.*?</tr>'# 定义一个正则表达式,获取球员名称,球队和得分数据
for i in range(1,6):
html = getHtml(i)
# print(html)
results = re.findall(regExp,html,re.S)
for result in results:
pointList.append(result)
return pointList
if __name__ == '__main__':
pointList = getData()
for list in pointList:
print(list)
有错误的地方敬请指出!觉得写得可以的话麻烦给个赞!欢迎大家评论区或者私信交流!