三阶段day26-爬虫介绍

2019-02-20  本文已影响0人  ATM_shark

爬取猫眼网站的电影信息

爬取页面信息的基本思路是:

1、获取页面信息
2、解析页面信息并匹配自己想要爬取的数据
3、组装获取的数据并保存至本地或者数据库
其中第二步解析页面时,需要充分分析页面的结构和信息来源,这也是能否爬取到信息最关键的准备。需要分析信息的来源是js渲染出来的还是页面本身自带,以便决定爬取信息的方式。

import json
import requests
import re


# 1获取网页
def get_page(url):
    # 伪装浏览器header
    headers = {
        "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
    }
    # 获取页面信息html
    response=requests.get(url,headers=headers)
    if response.status_code==200:
        return  response.text
    return 'error with you'


#去空格
def strips(list):
    n_list=[]
    for i in list:
        n_list.append(i.strip())
    return  n_list


# 2解析网页,爬取想要数据并返回
def parse_page(html):
#采用正则表达式匹配
    # 根据网页源代码编写所需内容正则表达式
    # 电影名
    title = re.compile('movieId.*?>.*?<img.*?<img.*?alt="(.*?)" class.*?', re.S)

    #匹配结果是一个列表
    titles=re.findall(title,html)
    strips(titles)

    # 演员
    start=re.compile('<p class="star">(.*?)</p>',re.S)
    starts=re.findall(start,html)
    starts=strips(starts)


    # 上映时间
    time=re.compile('<p class="releasetime">上映时间:(.*?)</p>',re.S)
    times=re.findall(time,html)
    strips(times)

    # 评分
    list=[]
    mark1=re.compile('<i class="integer">(.*?)</i>',re.S)
    marks1=re.findall(mark1,html)
    mark2=re.compile('<i class="fraction">(.*?)</i>',re.S)
    marks2 = re.findall(mark2, html)
    for i in range(len(marks1)):
        list.append(marks1[i]+(marks2[i]))
    strips(list)


    # 图片链接
    picture=re.compile('movieId.*?>.*?<img.*?<img.*?data-src="(.*?)" alt.*?', re.S)
    pictures=re.findall(picture,html)
    strips(pictures)

    # 保存图片
    for img in strips(pictures):
        save_img(img)

    # 组合列表
    result_list=[]
    for i in range(len(titles)):
        item={}
        item['title']=titles[i]
        item['start']=starts[i]
        item['time']=times[i]
        item['mark']=list[i]
        item['picture']=pictures[i]
        result_list.append(item)
    return  result_list



# 3写入保存json数据
def save_json(dict):
    # 将数据编码成json格式
    result_json_str=json.dumps(dict,ensure_ascii=False)
    with open('films.json','w',encoding='utf-8') as f:
        f.write(result_json_str)

#获取图片页面
def get_pic(url):
    # 伪装浏览器header
    headers = {
        "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
    }

    response=requests.get(url,headers=headers)
    if response.status_code==200:
        return  response.content

# 4保存图片
def save_img(url):
    # 获取图片页面
    img_content = get_pic(url)
    # 取图片名字
    file_name = url.split('/')[-1].split('@')[0]
    # 保存至本地
    with open('./imgs/%s' % file_name, 'wb') as f:
        f.write(img_content)



def main():
    # 1获取单个网页
    url='https://maoyan.com/board/4'
    html=get_page(url)

    # 2返回网页上爬取数据
    result=parse_page(html)
    print(result)

    # 3保存数据至json文件
    save_json(result)

if __name__ == '__main__':
    main()

爬取多个网页

思路:找到类似信息的网址,其一般有规律可循,对多个网页循环执行爬取信息即可

from day01.test2 import get_page, parse_page, save_json


def main_list():

    # 爬取多个网页
    result_list=[]
    for i in range(10):
        id=i*10
        # 组装域名
        url='https://maoyan.com/board/4?offset=%d' %id
        # 获取网页信息
        html=get_page(url)
        # 解析网页,爬取信息,组装数据
        result=parse_page(html)
        # 添加至一个列表中
        result_list.extend(result)
        print(i)
        print(result)
    # 保存至本地,并完成数据的格式转换
    save_json(result_list)

    return result_list

main_list()
上一篇 下一篇

猜你喜欢

热点阅读