美文网首页web服务器
Spider_maoyantop100

Spider_maoyantop100

作者: GHope | 来源:发表于2018-10-29 10:01 被阅读6次

初涉爬虫,爬取猫眼电影的top100相关信息(下载电影海报到本地指定路径,并抓取电影名称、主演和上映时间以json格式保存到本地)。

爬取过程

动态生成循环页面地址(模拟页面跳转) -- 设置响应头相关内容(猫眼比较好爬,本身并没有什么反爬措施) -- 使用requests方法发出请求 -- 判断请求状态(如果发生错误,返回空即可)-- 写正则过滤抓取页面 -- 字节流保存图片 -- 转换格式保存数据

import json
import requests
import re


def get_page(url):
    headers = {
        "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
    }
    # 名称参数赋值,位置参数会报错
    # response = requests.get(url,headers)
    response = requests.get(url=url, headers=headers)
    if response.status_code == 200:
        return response.content.decode('utf-8')
    return None


def pares_page(html):
    # 排行
    pattern = re.compile('<i class="board-index board-index-.*?">(.*?)</i>')
    item_rank = re.findall(pattern, html)
    # 电影
    pattern = re.compile('movieId.*?>.*?<img.*?<img.*?alt="(.*?)" class.*?', re.S)
    item_film = re.findall(pattern, html)
    # 海报
    # pattern = re.compile('<dd>.*?<img.*?<img.*?src="(.*?)"', re.S)
    # 主演
    pattern = re.compile('<p class="star">(.*?)</p>',re.S)
    item_star = re.findall(pattern, html)
    # 上映时间
    pattern = re.compile('<p class="releasetime">(.*?)</p>',re.S)
    item_time = re.findall(pattern, html)
    items = []
    for i in range(len(item_film)):
        film = {}
        film['rank'] = item_rank[i]
        film['film'] = item_film[i]
        film['star'] = item_star[i].strip()
        film['time'] = item_time[i]
        items.append(film)

    return items


def write_image(items):
    """
    根据图片地址下载图片到指定目录
    """
    url_parts = items.split("@")
    url_result = url_parts[0]
    filename = "./upload/%s" % url_result.split("/")[-1]
    r = requests.get(items)
    with open(filename, "wb") as f:
        f.write(r.content)


def write_json(items):
    movie_json = json.dumps(items, ensure_ascii=False, check_circular=True)
    filename = './猫眼top100'
    with open(filename,"a",encoding='utf-8') as f:
        f.write(movie_json)

def main():
    for i in range(0, 10):
        page = str(i * 10)
        url = 'http://maoyan.com/board/4?offset=' + page
        print(url)
        html = get_page(url)
        items = pares_page(html)
        # print(html)
        # 列表生成式[]
        # print([item.strip() for item in items])
        # 循环遍历爬取结果
        # for item in items:
        #     write_image(item)
        write_json(items)


if __name__ == '__main__':
    main()

总结
保存图片的时候是十张保存一次,写数据的时候也是十条数据一追加(注意写数据是指定的是a而不是w,否则后面保存的数据会覆盖前面保存的数据)。本身对于页面抓取的内容不是很清楚,列表字典的嵌套和循环也不是很熟悉,所以在json信息的完整性和格式上弄了半天。整体思路不太清晰,希望下次会好点!
GitHub地址

相关文章

  • Spider_maoyantop100

    初涉爬虫,爬取猫眼电影的top100相关信息(下载电影海报到本地指定路径,并抓取电影名称、主演和上映时间以json...

网友评论

    本文标题:Spider_maoyantop100

    本文链接:https://www.haomeiwen.com/subject/hragzftx.html