参考
Python 爬虫介绍
【Python+爬虫】爆肝两个月!拜托三连了!这绝对是全B站最用心(没有之一)
概述
requests做http请求豆瓣top250电影名单,用BeautifulSoup分析爬回的html信息,提取电影名以及评分,最后prettytable显示.
requests
参考
简介
Python requests 是一个常用的 HTTP 请求库,可以方便地向网站发送 HTTP 请求,并获取响应结果。
requests 模块比 urllib 模块更简洁。
安装库
可以用pycharm下面的终端,输入
pip install requests
在命令行调出python环境也行
此外可以直接在pycharm的设置里安装
代码
# 导入requests库
import requests
# UA:用户代理,表示浏览器基本身份信息
headers = {
'User-Agent': 。。。
}
# 请求地址
url = f'https://movie.douban.com/top250'
# 发送请求 不加header,requests会自动生成一个UA,但豆瓣有反爬那个UA的话是不能访问的,所以我们需要伪装浏览器去访问,所以需要上面的header
response = requests.get(url=url, headers=hearders)
这样可以产看自己浏览器的UA。3没有东西就刷新一下页面。
BeautifulSoup
概述
用于html信息的分析,需要第三方库bs4
网页信息分析
我是用的是Edge浏览器
豆瓣电影top250
打开上面的页面
用快捷键F12 或者 在页面右键鼠标点击下拉菜单里检测就可以打开开发者界面
可以通过标红的地方更改显示位置.
在元素界面下,点击圈红的地方就可以在页面中选择一个元素进行检查.
我们需要电影名称就把鼠标移动到电影名处
发现电影名在span里,同时它的class是title
同样的方法可以发现评分也在span,但property是v:average
代码
# 导入BeautifulSoup库
from bs4 import BeautifulSoup
# 提取html文本
html = response.text
# 指定用html解析器
soup = BeautifulSoup(html, 'html.parser')
# 取到所有标题
all_titles = soup.findAll('span', attrs={'class': 'title'})
打印all_titles会发现有带/的副标题,但我们要的只是主标题.所以添加下面一段话.
for title in all_titles:
title_s = title.string
if '/' not in title_s:
print(title_s)
list
概要
我用列表是为了把电影名和电影评分信息存储在列表里,最后好用prettytable来显示.
参考
代码
# 创建空列表
title_string = []
# 给列表添加元素
title_string.append(title_s)
prettytable
# 导入prettytable重命名为pt
import prettytable as pt
# 实例化一个对象
tb = pt.PrettyTable()
tb.field_names = [
'序号',
'片名',
'评分',
]
....
for num in range(0, 250, 1):
tb.add_row([num+1, title_string[num], average_string[num]])
print(tb)
完整代码
import requests
from bs4 import BeautifulSoup
# 导入prettytable重命名为pt
import prettytable as pt
# 实例化一个对象
tb = pt.PrettyTable()
tb.field_names = [
'序号',
'片名',
'评分',
]
headers = {
'User-Agent': '。。。' #产看浏览器UA复制到这
}
title_string = []
average_string = []
for start_num in range(0, 250, 25):
url = f'https://movie.douban.com/top250?start={start_num}'
response = requests.get(url=url, headers=headers)
# print(response)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
# print(soup)
all_titles = soup.findAll('span', attrs={'class': 'title'})
for title in all_titles:
title_s = title.string
if '/' not in title_s:
title_string.append(title_s)
# print(title.string)
# print(num, title_string, sep='--')
all_average = soup.findAll('span', attrs={'property': 'v:average'})
for average in all_average:
average_string.append(average.string)
# print(title_string)
# print(average_string)
for num in range(0, 250, 1):
tb.add_row([num+1, title_string[num], average_string[num]])
print(tb)