python爬虫学习之获取猫眼电影排名前10

我们用正则表达式来完成这个任务,并把读取到的内容写入到文本中。

首先打开猫眼电影的榜单,网址是这个:http://maoyan.com/board

首先获取该网页的html代码,注意千万别用开发者模式查看网页的源码,源码可能和response.text不一样

然后用python的第三方库,requests库进行网页html的爬取

注意:1、在获取源代码之前我们要设置一下user-Agent    2、如果获取失败要进行异常处理

代码如下:

def get_single_page(url):
    headers = {
        'User - Agent': 'Mozilla / 5.0(Windows NT 10.0;'
        + 'WOW64;'
        +'rv: 61.0) Gecko / 20100101'
        +'Firefox / 61.0'

    }
    response = requests.get(url)
    try:
        if (response.status_code == 200):
            return response.text
        return None
    except requests.exceptions.HTTPError:
        return None

相应的主函数:

def main(url):
    html = get_single_page(url)
    print(html)

然后用python自带的模块--re块,进行正则表达式的写入。

由于电影页面等信息都在<dd></dd>标签页下,所以我们写的正则表达式开头加上<dd>,结尾加上</dd>。

正则表达式如下:

pattern = re.compile(
        '<dd>.*?board-index.*?>(\d+)</i>'       #排名
        +'.*?data-src="(.*?)".*?>'#图片
         +'.*?title.*?>(.*?)</a>'#电影名
        +'.*?star.*?>(.*?)</p>'#主演
         +'.*?releasetime.*?>(.*?)</p>'#上映时间
          +'.*?integer.*?>(.*?)</i>'#排名整数
        +'.*?fraction.*?>(.*?)</i>.*?</dd>'#排名小数
        ,re.S
            )

有了这些,我们直接用findall函数获取的内容直接打印下来

response = re.findall(pattern,html)
print(response)

打印后我们发现内容很乱,应为findall函数返回的是一个列表,所以我们通过yield进行分类:

    for item in response:
        yield {
            'index':item[0],
            'img':item[1],
            'name':item[2],
            'star':item[3],
            'realeasetime':item[4],
            'integer':item[5],
            'fraction':item[6]
        }

这样输出的结果就好看了好很多。

然后我们进行写入文件


def write_to_file(content):
    with open('result.txt','a',encoding='utf-8') as f:#使用utf-8编码格式
        print(type(json.dumps(content)))
        f.write(json.dumps(content,ensure_ascii=False)+'\n')#防止汉字输入不正确从而变成乱码,我们将ensure_ascii设置为False

这样整个代码就可以写出来了,整体代码如下:

import json

import requests
import requests.exceptions
import re


# 返回单页的信息
def get_single_page(url):
    headers = {
        'User - Agent': 'Mozilla / 5.0(Windows NT 10.0;'
        + 'WOW64;'
        +'rv: 61.0) Gecko / 20100101'
        +'Firefox / 61.0'

    }
    response = requests.get(url)
    try:
        if (response.status_code == 200):
            return response.text
        return None
    except requests.exceptions.HTTPError:
        return None


# 解析页面,用正则表达式获取想要的信息,这里注意的是,千万别用开发者模式查看网页的源码,源码可能和response.text不同
def parse_one_page(html):
    pattern = re.compile(
        '<dd>.*?board-index.*?>(\d+)</i>'       #排名
        +'.*?data-src="(.*?)".*?>'#图片
         +'.*?title.*?>(.*?)</a>'#电影名
        +'.*?star.*?>(.*?)</p>'#主演
         +'.*?releasetime.*?>(.*?)</p>'#上映时间
          +'.*?integer.*?>(.*?)</i>'#排名整数
        +'.*?fraction.*?>(.*?)</i>.*?</dd>'#排名小数
        ,re.S
            )
    response = re.findall(pattern,html)
    for item in response:
        yield {
            'index':item[0],
            'img':item[1],
            'name':item[2],
            'star':item[3],
            'realeasetime':item[4],
            'integer':item[5],
            'fraction':item[6]
        }


def write_to_file(content):
    with open('result.txt','a',encoding='utf-8') as f:#使用utf-8编码格式
        print(type(json.dumps(content)))
        f.write(json.dumps(content,ensure_ascii=False)+'\n')#防止汉字输入不正确从而变成乱码,我们将ensure_ascii设置为False


def main(url):
    html = get_single_page(url)
    print(html)
    for it in parse_one_page(html):
        write_to_file(it)


main('http://maoyan.com/board')

猜你喜欢

转载自blog.csdn.net/qq_38851184/article/details/81355172