正则表达式爬取猫眼Top100并存入mongodb数据库

import re
import requests
import pymongo
from multiprocessing import Pool
from requests.exceptions import RequestException

client = pymongo.MongoClient('localhost', 27017)
maoyan = client['maoyan']  # 给数据库命名
top100 = maoyan['top100']  # 表名


# 构造url请求列表
def main(offset):
    url = 'http://maoyan.com/board/4?offset=' + str(offset)
    headers = {  # 请求头,告诉是web服务器从浏览器端进行访问
        'User-Agent':
            'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
    }
    web_data = get_one_page(url, headers)
    parse_one_page(web_data)  # 解析请求url返回的内容


# 向浏览器发送请求
def get_one_page(url, headers):
    try:
        web_data = requests.get(url, headers=headers, verify=False)
        # verify=false,忽略验证SSL证书
        if web_data.status_code == 200:  # 返回200状态码表示请求成功
            return web_data.text
            # requests请求返回的是字符流,后缀.text会让requests库自动选择合适的编码将字符流转为文本模式
        return None  # 请求不成功返回空
    except RequestException:
        return None


# 对请求返回的结果进行解析
def parse_one_page(web_data):
    pattern = re.compile('
.*?board-index.*?>(.*?).*?' + 'poster-default.*?src="(.*?)".*?title="(.*?)".*?"star">\s+(.*?)\s+

.*?releasetime">(.*?)

' + '.*?integer">(.*?).*?fraction">(.*?).*?
', re.S) # 利用正则表达式匹配,匹配内容为一个个的(.*?) # re.compile(编译正则表达式模式,可提高效率)返回一个正则表达式对象 # re.S 使 . 的作用扩展到整个字符串,包括“\n”,“\t”. items = re.findall(pattern, web_data) for item in items: top100.insert_one({ 'index': item[0], 'image':item[1], 'title': item[2], 'actors': item[3].strip()[3:], # 从3到结束(切片从0数起) 'time': item[4].strip()[5:], 'scores': item[5] + item[6] }) if __name__ == '__main__': pool = Pool() # 创建不指定进程数量的进程池 pool.map(main, [i * 10 for i in range(10)]) # map(高阶函数),第一个参数接收一个函数,第二个参数为一个迭代器 # 每次都从该迭代器取出一个元素作为 main 的参数 pool.close() # 进程池,先 close 再 join ,关闭进程池,不再接受新的进程 pool.join() # 主进程阻塞等待子进程的退出

正则表达式爬取猫眼Top100并存入mongodb数据库_第1张图片

你可能感兴趣的:(python,爬虫)