天天看点

《python网络爬虫和信息提取》:全球电影票房排行榜(附更改后的代码)

全球电影票房排行榜也是一个经常被用来讲网络爬虫的实例。我们同样用中国大学排名的代码,修改一下来爬取相应内容。
      

       打开网页链接:http://www.piaofang.biz/,先来观察页面结构:

《python网络爬虫和信息提取》:全球电影票房排行榜(附更改后的代码)

          下面我们再来分析网页源代码:

《python网络爬虫和信息提取》:全球电影票房排行榜(附更改后的代码)

      1、网页中有"body"和"table"标签,没有"tbody"标签 。

      2、有一个包含“排名”、“电影名”等六项内容的表头的“tr"子标签。

      3、相比第2名,在第1名的子标签内,第1名前多了“全球电影票房排行榜”几个字。11名、21名好像也是一样。

      4、阿凡达前也是有一个“a"标签。

      5、 第10名和11名之间有一行空行。

《python网络爬虫和信息提取》:全球电影票房排行榜(附更改后的代码)

      解决思路:

      1、对于空行问题。 增加一个if语句,判断列表长度是否为6。

      2、表头和内容标签层级数不同,用“ulist.append()”时会出错,可以用“try-except"语句来解决。

      3、第1名及第11名前的“全球电影票房排行榜”,用strip()来解决。

     修改后的代码如下:

import requests
import bs4
from bs4 import BeautifulSoup

def getHTML_Text(url):
    try:
        kv = {'User-Agent':'Mozilla/5.0'}
        r = requests.get(url,timeout = 20 ,headers = kv)
        r.raise_for_status()
        # print('是否=200',r.status_code) #如果状态不是200,则产生网络访问异常
        r.encoding = r.apparent_encoding
        # print(r.request.headers) # 如不能正常访问网络,可参考其中内容修改kv中的信息。
        return r.text
    except:
        return '网络打开异常!'

def fillList(ulist,html):
    soup = BeautifulSoup(html,'html.parser')
    for tr in soup.find('table').children:  # 网页上没有‘tbody’标签,用‘body’也不能成功。
        if isinstance(tr,bs4.element.Tag):
            tds = tr('td')
            # print('tds=', tds)
            if len(tds)>=6: # 去掉空列表,以防出错“list index out of range”
                try:
                    ulist.append([tds[0].text.strip('全球电影票房排行榜'),tds[1]('a')[0].string,tds[2].string,tds[3].string,tds[4].string,tds[5].text])
                    # strip('全球电影票房排行榜')用于删除第一名的前缀,用text代替string,防止下行出现“unsupported format string passed to NoneType.__format__”
                except:
                    ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string, tds[4].string,tds[5].string])  # 提取标题
            else:
                pass
    # print(ulist)

def print_all_result(ulist,num):
    tplt = "{0:>6}\t{1:{6}^18}\t\t{2:^6}\t{3:{6}^6}\t{4:{6}^16}\t{5:{6}>8}"
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0].strip(),u[1].strip(),u[2].strip(),u[3].strip(),u[4].strip(),u[5].strip(),chr(12288)))

def main():
    url = 'http://www.piaofang.biz/'
    html = getHTML_Text(url)
    result = []
    fillList(result,html)
    print_all_result(result,21)

if __name__ == '__main__':
    main()
           

运行结果如下:

《python网络爬虫和信息提取》:全球电影票房排行榜(附更改后的代码)