利用requests和正则表达式爬取虎扑

发布时间:2019-08-18 13:02:19编辑:auto阅读(1549)

    正则表达式
    解释:符合某个模式(规则)的文本
    在线测试工具:https://tool.oschina.net/regex
    详细的正则表达式规则,可见:http://www.runoob.com/python3/python3-reg-expressions.html


    re模块
    概述:re为正则表达式提供了很多api,对正则表达式的使用提供了便利。
    修饰符:
     1、re.I:忽略大小写
     2、re.M:多行匹配
     3、re.S:是.匹配包括换行在内的所有字符
    方法:match()
    参数:正则表达式,待匹配的字符串,修饰符,返回一个SRE.Match对象
    代码演示:

    content = 'Hello World Python3.6'
    pattern = '^\w{5}\s\w{5}\s[p]+\w{5}\d\S\d'
    result = re.match(pattern,content,re.I)
    print(result.group())

    SRE.Match对象的方法有:
    group():返回匹配的内容
    span():匹配的范围


    贪婪模式和非贪婪模式
     贪婪匹配:.*会匹配尽可能多的字符
     非贪婪匹配:格式是.?,或匹配尽可能少的字符


    re模块其他方法
       search():和match()类似,但match从字符串开头就开始匹配,若匹配不到就会返回None,而search则不会;
      findall():获得所有匹配的内容
      sub():修改文本
      compile():将正则表达式编译成对象,可重复使用
    代码演示:

    content = 'birthday:19970704'
    result = re.sub('\d','5',content)#参数:正则表达式,被替换字符串,被修改文本
    print(result)

    爬取虎扑网球员得分榜
    首先打开虎扑网,切到得分榜页面:https://nba.hupu.com/stats/players/pts
    点击下一页,查看得分榜51-100的球员,发现此时链接变成:https://nba.hupu.com/stats/players/pts/2 ,多点几页就会发现得分榜链接的构造是:https://nba.hupu.com/stats/players/pts/ + 页数
    再查看元素(按F12),发现表格的每一行是这么组成的:
    利用requests和正则表达式爬取虎扑网球员数据
    于是就可以写正则表达式了,需要获取的内容用括号括起来
    代码如下:

    import requests
    import re
    
    def get_Page(url):
    #获取网页内容
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
    }
    response = requests.get(url,headers=headers)
    if response.status_code == 200:
    return response.text
    else:
    print('您输入的网址错误!')
    
    def parse_page(html):
    #解析网页
    pattern = '<tr>.*?<td.*?>(.*?)</td>.*?<td.*?><a.*?>(.*?)</a></td>.*?<td.*?><a.*?>(.*?)</a></td>.*?<td.*?>(.*?)</td>.*?'
    items = re.findall(pattern, html,re.S)
    # for item in items:
    #     print(item[0],item[1],item[2],item[3])
    return items
    
    def save(content):
    with open('nba.txt','a',encoding='utf-8') as f:
    for item in content:
    f.writelines(item)
    f.write('\n')
    
    if __name__ == '__main__':
    #保存前得分榜150名
    base_url = 'https://nba.hupu.com/stats/players/pts/'
    for i in range(1,4):
    url = base_url + str(i)
    html = get_Page(url)
    reslut = parse_page(html)
    save(reslut)

    结果展示:
    利用requests和正则表达式爬取虎扑网球员数据

关键字