参考

Python 爬虫介绍
【Python+爬虫】爆肝两个月!拜托三连了!这绝对是全B站最用心(没有之一)

概述

requests做http请求豆瓣top250电影名单,用BeautifulSoup分析爬回的html信息,提取电影名以及评分,最后prettytable显示.
在这里插入图片描述

requests

参考

Python 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来显示.

参考

python列表

代码

# 创建空列表
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)
Logo

欢迎加入西安开发者社区!我们致力于为西安地区的开发者提供学习、合作和成长的机会。参与我们的活动,与专家分享最新技术趋势,解决挑战,探索创新。加入我们,共同打造技术社区!

更多推荐