python爬虫小例子:爬取猫眼电影Top10电影相关信息(代码超详细解读)

目标网址:http://www.maoyan.com/board/4

Top100榜单共分为10页,经过观察,每一页的URL区别为:get请求参数 offset 变化。

所以URL如下设置:

url = 'http://www.maoyan.com/board/4?offset=' + str(page_num)

获取单页的html的代码写为一个函数:

# 获取单页的html
def get_one_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'
    }
    # requests.get(url,headers) 头这样设置无法返回结果,相当于没有加请求头
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    return None

我们抓取的内容为6个:排行序号、图片地址、电影名、演员、上映时间(国家)、得分

经过观察,每一个电影的信息在html中的一个<dd></dd>标签中,如下图:

使用正则表达式,对我们所需信息的解析函数如下:

# 进行单页的解析,返回单页中我们需要的全部信息
def parse_one_page(html):
    # 提取排名数 <dd>.*?board-index.*?>(.*?)</i>
    # 提取图片  data-src="(.*?)"
    # 提取电影名  <p.*?name.*?a.*?>(.*?)</a></p>
    # 提取演员  <p.*?star">(.*?)</p>
    # 提取上映时间  <p.*?releasetime">(.*?)</p>
    # 提取评分  <p.*?score.*?integer">(.*?)</i><i.*?fraction">(.*?)</i></p>
    pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?<p.*?name.*?a.*?>(.*?)</a></p>.*?<p.*?star">(.*?)</p>.*?<p.*?releasetime">(.*?)</p>.*?<p.*?score.*?integer">(.*?)</i><i.*?fraction">(.*?)</i></p>.*?</dd>',re.S)
    items = re.findall(pattern,html)
    for item in items:
        # 使用 yield 关键字,关键字所在的函数变为一个生成器(generator),
        # 调用该函数会返回一个 iterable 对象,然后就可以迭代进行输出。
        # 使用 yield 的好处是,对于需要返回很大空间的数据,可以节省内存空间。
        # 当你调用这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象。
        # 当你使用for进行迭代的时候,函数中的代码才会执行。相当于每次返回一次迭代的数据,节省了很大的内存空间。
        yield {
            'index':item[0].strip(),
            'image':item[1].strip(),
            'title':item[2].strip(),
            'actor':item[3].strip()[3:] if len(item[3])>3 else '',
            'time':item[4].strip()[5:] if len(item[4])>5 else '',
            'score':item[5].strip() + item[6].strip()
        }

然后我们将获取的信息写入到一个txt文件中,写入每一条电影信息的函数如下:

# 写入一条电影信息,实现文本追加
def write_one_movie(content):
    with open('maoyanResult.txt','a',encoding='utf-8') as f:
        # 这里通过 JSON 库的 dumps()方法实现字典的序列化,
        # 指定 ensure_ascii 参数为 False,这样可以保证输出结果是中文形式而不是 Unicode 编码
        # print(type(json.dumps(content)))
        f.write(json.dumps(content,ensure_ascii=False) + '\n')
        # 但是试了一下,直接str()转换也可以实现相同的写入
        # f.write(str(content) + '\n')

然后将以上三个函数汇总,得到获取一页数据的总控制函数:

# 获取一页数据的总控制方法
def main_one_page(page_num):
    maoyan_url = 'http://www.maoyan.com/board/4?offset=' + str(page_num)
    html = get_one_page(maoyan_url)
    for item in parse_one_page(html):
        write_one_movie(item)

最后整合起来,分页爬取,将Top100全部爬下来:

if __name__ == '__main__':
    if os.path.exists('maoyanResult.txt'):
        os.remove('maoyanResult.txt')
    for i in range(0,99,10):
        print('正在爬取第 {} 页 ...'.format(int(i/10 + 1)))
        main_one_page(i)
        time.sleep(1)

最终结果如下图

 

最终代码整合

import requests
import re
import json
import os
import time

# 获取单页的html
def get_one_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'
    }
    # requests.get(url,headers) 头这样设置无法返回结果,相当于没有加请求头
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    return None

# 进行单页的解析,返回单页中我们需要的全部信息
def parse_one_page(html):
    # 提取排名数 <dd>.*?board-index.*?>(.*?)</i>
    # 提取图片  data-src="(.*?)"
    # 提取电影名  <p.*?name.*?a.*?>(.*?)</a></p>
    # 提取演员  <p.*?star">(.*?)</p>
    # 提取上映时间  <p.*?releasetime">(.*?)</p>
    # 提取评分  <p.*?score.*?integer">(.*?)</i><i.*?fraction">(.*?)</i></p>
    pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?<p.*?name.*?a.*?>(.*?)</a></p>.*?<p.*?star">(.*?)</p>.*?<p.*?releasetime">(.*?)</p>.*?<p.*?score.*?integer">(.*?)</i><i.*?fraction">(.*?)</i></p>.*?</dd>',re.S)
    items = re.findall(pattern,html)
    for item in items:
        # 使用 yield 关键字,关键字所在的函数变为一个生成器(generator),
        # 调用该函数会返回一个 iterable 对象,然后就可以迭代进行输出。
        # 使用 yield 的好处是,对于需要返回很大空间的数据,可以节省内存空间。
        # 当你调用这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象。
        # 当你使用for进行迭代的时候,函数中的代码才会执行。相当于每次返回一次迭代的数据,节省了很大的内存空间。
        yield {
            'index':item[0].strip(),
            'image':item[1].strip(),
            'title':item[2].strip(),
            'actor':item[3].strip()[3:] if len(item[3])>3 else '',
            'time':item[4].strip()[5:] if len(item[4])>5 else '',
            'score':item[5].strip() + item[6].strip()
        }

# 写入一条电影信息,实现文本追加
def write_one_movie(content):
    with open('maoyanResult.txt','a',encoding='utf-8') as f:
        # 这里通过 JSON 库的 dumps()方法实现字典的序列化,
        # 指定 ensure_ascii 参数为 False,这样可以保证输出结果是中文形式而不是 Unicode 编码
        # print(type(json.dumps(content)))
        f.write(json.dumps(content,ensure_ascii=False) + '\n')
        # 但是试了一下,直接str()转换也可以实现相同的写入
        # f.write(str(content) + '\n')

# 获取一页数据的总控制方法
def main_one_page(page_num):
    maoyan_url = 'http://www.maoyan.com/board/4?offset=' + str(page_num)
    html = get_one_page(maoyan_url)
    for item in parse_one_page(html):
        write_one_movie(item)

if __name__ == '__main__':
    if os.path.exists('maoyanResult.txt'):
        os.remove('maoyanResult.txt')
    for i in range(0,99,10):
        print('正在爬取第 {} 页 ...'.format(int(i/10 + 1)))
        main_one_page(i)
        time.sleep(1)

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,您想了解如何使用Python爬虫爬取猫眼电影评论,是吗?以下是一个简单的示例代码,可以帮助您开始: ``` import requests import json # 请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 爬取数据的网址 url = 'https://m.maoyan.com/mmdb/comments/movie/1299372.json?_v_=yes&offset=0&startTime=0' # 发送请求 response = requests.get(url, headers=headers) # 解析json数据 comments = json.loads(response.text)['cmts'] for comment in comments: print(comment['content']) ``` 这个代码将会向猫眼电影的评论网址发送请求,获取电影《误杀》的评论,并将评论的内容打印出来。 需要注意的是,这只是一个简单的示例代码。如果您想要爬取更多评论,需要修改offset和startTime参数,通过多次请求来获取更多的评论数据。同时,需要遵守网站的爬虫规则,不要过于频繁地发送请求,以免被网站屏蔽。 ### 回答2: Python爬虫是一种用于网页数据抓取的技术,能够让我们自动化地从网页上获取所需的数据。猫眼电影是一个非常受欢迎的电影网站,我们可以利用Python爬虫技术来抓取该网站上的电影评论。 首先,我们需要导入相关Python库,如requests、BeautifulSoup等,这些库可以帮助我们发送网络请求并解析网页内容。然后,我们可以使用requests发送HTTP请求,获取猫眼电影的网页源代码。 接下来,我们可以使用BeautifulSoup库来解析网页源代码,提取出电影评论所在的HTML标签。通过分析网页结构,可以找到包含评论内容的HTML标签,并使用BeautifulSoup提供的方法将其提取出来。 在提取评论内容后,我们可以将其存储到本地文件或数据库中,以便后续分析和使用。同时,我们也可以进一步提取其他信息,如评论用户的昵称、评分等。 在进行爬取时,我们需要注意一些爬虫的基本道德规范,如尊重网站的隐私政策、遵守网站的访问频率限制等。 总之,利用Python爬虫技术可以方便地获取猫眼电影评论数据,并进行后续分析和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值