Python3学习笔记:Request+正则表达式爬取猫眼电影Top100

  • 首先分析目标网页:https://maoyan.com/board/4?offset=0

    图中可以看到第2页URL中的offset=10,第3页offset=20,所以是通过改变URL中的offset来改变电影的展示,所以可以利用for循环动态改变URL
  • 分析网页代码

    图中可以看到每一部电影都是一个
    的标签,图片是一个img标签,电影名称是一个超链接,主演是一个class标签……
  • 需要用到的库
import json
from multiprocessing import Pool
import requests
from requests.exceptions import RequestException
import re

  • 定义请求单页方法
def get_one_page(url):  # 定义请求单页方法
    try:
        response = requests.get(url)
        if response.status_code == 200:  # 通过状态码判断返回结果
            return response.text
        return None
    except RequestException:  # 异常处理
        return None

如果状态码等于200,则代表请求成功,返回网页内容, 其他状态码则返回None;如出现异常,则同样返回None

  • 定义解析单页方法
    Python3学习笔记:Request+正则表达式爬取猫眼电影Top100_第1张图片
    使用re.compile方法进行正则匹配,以top1为例,第一步找到起始信息,把
    写上去,.*?代表贪婪匹配,board-index为标准符,结尾,这样就把1这个数字匹配了,后面的以此类推
def parse_one_page(html):  # 利用正则表达式对网页解析
    pattern = re.compile('
.*?board-index.*?(\d+).*?data-src="(.*?)".*?name"> '.*?>(.*?).*?star">(.*?)

.*?releasetime">(.*?)

'
'.*?integer">(.*?).*?fraction">(.*?).*?
'
, re.S) items = re.findall(pattern, html) # findall方法进行匹配 for item in items: # 遍历 yield { # 字典生成器 'index': item[0], 'image': item[1], 'title': item[2], 'actor': item[3].strip()[3:], 'time': item[4].strip()[5:], 'score': item[5] + item[6] }

yield可以起到一个字典生成器的作用

  • 写入文件
def write_to_file(content):  # 写入文件
    with open('result.txt', 'a', encoding='utf-8')as f:  # 追加写入
        f.write(json.dumps(content, ensure_ascii=False) + '\n')  # 转换成字符串
        f.close()

  • 全部代码
import json
import requests
from requests.exceptions import RequestException
import re


def get_one_page(url):  # 定义请求单页方法
    try:
        response = requests.get(url)
        if response.status_code == 200:  # 通过状态码判断返回结果
            print(response.text)
            return response.text
        return None
    except RequestException:  # 异常处理
        return None


def parse_one_page(html):  # 利用正则表达式对网页解析
    pattern = re.compile('
.*?board-index.*?(\d+).*?data-src="(.*?)".*?name"> '.*?>(.*?).*?star">(.*?)

.*?releasetime">(.*?)

'
'.*?integer">(.*?).*?fraction">(.*?).*?
'
, re.S) items = re.findall(pattern, html) # findall方法进行匹配 for item in items: # 遍历 yield { # 字典生成器 'index': item[0], 'image': item[1], 'title': item[2], 'actor': item[3].strip()[3:], 'time': item[4].strip()[5:], 'score': item[5] + item[6] } def write_to_file(content): # 写入文件 with open('result.txt', 'a', encoding='utf-8')as f: # 追加写入 f.write(json.dumps(content, ensure_ascii=False) + '\n') # 转换成字符串 f.close() def main(offset): # 定义main方法 url = 'https://maoyan.com/board/4?offset=' + str(offset) html = get_one_page(url) # 接收URL parse_one_page(html) # 解析 for item in parse_one_page(html): print(item) write_to_file(item) if __name__ == '__main__': # 执行main方法 for i in range(10): main(i*10)

你可能感兴趣的:(Python)