Python爬虫爬取猫眼电影排行

本博客介绍使用爬虫爬取猫眼电影最受期待榜单

先看main函数代码, 这个函数用来获取一个页面上的榜单信息, 我们大致了解一下爬虫程序的框架

def main(offset):
    url = 'http://maoyan.com/board/6?offset=' + str(offset)
    html = getHtml(url)
    info = getRank(html)
    show(info)

我们可以看到, main函数有一个offset参数传递进来

  • 首先第一步是构造url, 通过传递的offset参数构造不同页面的url.
  • 然后是调用getHtml函数获取html页面.
  • 再调用getRank函数获取排行.
  • 最后show函数用来展示结果.

首先我们观察url, 用chrome浏览器打开http://maoyan.com/board/6?offset=0, 就可以看到页面了. 观察一下会发现榜单有好几页, 翻页之后offset参数变成了10,20,30,40, 那么我们就可以只修改offset参数获取不同页面上的信息了. offset作为参数传递

然后我们具体获取一个页面的信息

调用getHtml函数获取到html页面, 将文件传递进getRank页面, 用正则表达式分析我们需要的信息(可通过浏览器查看源代码分析). getRank返回的列表就是一个排行上的信息了, 它是一个元组, 有三个元素, 分别是排行, 名称, 主演.

最后是展示阶段, 如果就这样输出会很难看, 那么我们就需要进行一些格式化处理. 可通过下面这样的代码来格式化

def show(info):
    tmp = '{0:^5}{1:{3}^16}{2:{3}<10}'
    for i in range(len(info)):
        u = info[i]
        with open('save.txt', 'a', encoding='utf-8') as f:
            f.write(tmp.format(u[0], u[1], u[2], chr(12288)) + '\n')
        print(tmp.format(u[0], u[1], u[2], chr(12288)))

如果我们想要输出到一个txt文件当中, 就用python的文件写入方法写入, 这里要注意的是使用模式'a', 这样后面的内容就可以追加进来而不会覆盖之前的内容了. encoding='utf-8', 设置编码也是非常重要的, 不然txt文件会是乱码的.

完整代码

import re
import requests

def getHtml(url):
    try:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'
        }
        r = requests.get(url, headers=headers)
        r.encoding = r.apparent_encoding
        r.raise_for_status()
        # print(r.text)
        return r.text
    except:
        return ""

def getRank(html):
    r = re.compile(r'index-(\d+).*?title="(.*?)".*?"star">(.*?)</p>', re.S)
    info = re.findall(r, html)
    return info

def show(info):
    tmp = '{0:^5}{1:{3}^16}{2:{3}<10}'
    for i in range(len(info)):
        u = info[i]
        with open('save.txt', 'a', encoding='utf-8') as f:
            f.write(tmp.format(u[0], u[1], u[2], chr(12288)) + '\n')
        print(tmp.format(u[0], u[1], u[2], chr(12288)))

def main(offset):
    url = 'http://maoyan.com/board/6?offset=' + str(offset)
    html = getHtml(url)
    info = getRank(html)
    show(info)

if __name__ == '__main__':
    with open('save.txt', 'w', encoding='utf-8') as f:
        f.write('{0:{3}^5}{1:{3}^16}{2:{3}^10}'.format('排行', '名称', '主演', chr(12288)) + '\n')
    print('{0:{3}^5}{1:{3}^16}{2:{3}^10}'.format('排行', '名称', '主演', chr(12288)))
    for i in range(5):
        main(i * 10)

猜你喜欢

转载自blog.csdn.net/wjh2622075127/article/details/81355645