利用BeautifulSoup和requests爬取豆瓣TOP250的电影名及其链接

打开命令行:

安装requests库

pip install requests

安装bs4库

pip install beautifulsoup4

此处为爬取豆瓣网页的代码

import requests
# 调用bs4库里的BeautifulSoup类
from bs4 import BeautifulSoup

# 利用requests库的get方法爬取网页
def getHtmlText(url):
    try:
        r = requests.get(url, timeout=20)
        r.raise_for_status()
        # 分析得到网页的编码格式
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

# 爬取数据并放入list列表中
def fillList(list,html):
    lst = []
    try:
        # 调用bs4库里的BeautifulSoup类的方法,利用BeautifulSoup的html.parser解析网页
        soup = BeautifulSoup(html, "html.parser")
        div = soup.find_all('div',attrs={'class':'hd'})
        for i in div:
            # name = i.find_all('span') 下边为简写写法
            name = i('span')
            # 以\xa0为分隔符将name[1]进行2次分割
            Name = name[1].string.split('\xa0',2)
            href = i('a')
            # 将href从bs4.element.ResultSet类型转换为str类型
            for h in href:
                lst.append(str(h))
            # 此时"".join(lst)即为href的str类型
            soup1 = BeautifulSoup("".join(lst), "html.parser")
            # Href即为得到电影的链接
            Href = soup1.a.attrs['href']
            # 清空lst列表
            lst.clear()
            # 将数据存入列表中
            list.append([name[0].string, Name[2],Href])
    except:
        print("fillList()函数解析出错")

# 输出格式
def printList(list,num):
    # 由于中英文空格占用的长度不同,导致对齐时可能会出现问题
    # 此处的{4},是指当用.format()方法时,用第五个元素代替英文空格
    # chr(12288)即为中文空格
    tplt = "{0:^10}\t{1:{4}^15}\t{2:{4}<30}\t{3:<30}"
    print(tplt.format("排名", "电影名", "电影链接", "电影别名",chr(12288)))
    count = 0
    # 输出的格式
    for i in range(num):
        count = count + 1
        lst = list[i]
        print(tplt.format(count,lst[0],lst[2],lst[1],chr(12288)))

def main():
    # 首页网址
    start_url = "https://movie.douban.com/top250"
    # page为需要爬取的网页的页数
    page = 5
    list = []
    # num为爬取的电影的个数,一页是有25个电影数据
    num = page * 25
    for i in range(page):
        try:
            # 由分析知每增加一页start增加25
            url = start_url + '?start=' + str(25* i)
            html = getHtmlText(url)
            fillList(list, html)
        except:
            # 如果出现错误,继续执行
            continue
    printList(list, num)
main()

 效果图如下:

利用BeautifulSoup和requests爬取豆瓣TOP250的电影名及其链接