用Requests+正则表达式爬取猫眼电影

# -*- coding: utf-8 -*-
#! /usr/bin/env python 
import requests
import urllib
from requests.exceptions import RequestException  #异常代码模块
import sys 
import re
import json
from multiprocessing import Pool  #多线程


def get_one_page(url):
    try:
        response = requests.get(url) #打开网址
        if response.status_code == 200: #判断状态码
            return response.text      #状态码成功返回网页源代码
        return None       #状态码其他结果返回None
    except RequestException: #弄一个错误的总类就好,子类太多这里不考虑
        return None

def pare_one_page(html):
    pattern =re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
                       +'.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
                       +'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)  #正则表达式模板,这鬼东西要仔细
    items = re.findall(pattern,html)
    #print(items)
    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') #json.dumps将字典转换成字符串
        f.close()

def main(offset):
    url = 'http://maoyan.com/board/4?offset='+ str(offset)
    non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd) #解决网站中 python自身编码不能映射奇怪的符号
    page = urllib.request.urlopen(url)  #模块urllib发送HTTP请求,打开网站
    html = page.read().decode().translate(non_bmp_map) #返回得到的网站,并解码网站中奇怪的符号
    for item in pare_one_page(html):  #正则表达式调用
        print(item)
        write_to_file(item)  #调用写入文本
    #print(html)


if __name__ == '__main__':
  for i in range (10):
      main(i*10)   #单线程遍历
      #pool=Pool()
      #pool.map(main,[i*10 for i in range(10)])  #多线程完成,出现乱码  

猜你喜欢

转载自blog.csdn.net/qq_15907907/article/details/80237150