利用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()
效果图如下: