1.【python爬虫学习笔记】爬取豆瓣电影top250

基于requests库以及lxml库,实现豆瓣top250名单的爬取,并将海报存储在本地。

模块使用如下

import requests
from lxml import etree
import os
import time

requests库以及lxml库均为第三方库需另外安装。

requests用于网页的请求部分

1.构建网页请求函数,URL作为参数,返回requests对象。

def url_open(url):
    # 网页请求
    web_data = requests.get(url)
    return web_data

lxml用于解析网页结构,寻找特定元素

2.构建网页结构解析函数,URL及xpath路径作为参数,返回检索结果列表

def get_element(url,paths):
    # 解析成html格式
    html = url_open(url).text
    # 解析html
    tree = etree.HTML(html)
    tag = []
    for path in paths:
        # 检索特定标签元素
        #将检索结果生成list
        tag.append(tree.xpath(path))
    return tag

3.构建主函数

初始参数如下

包括首页的URL,并装于list中

    urls = ['https://movie.douban.com/top250']
    paths = ['//div[@class="paginator"]/a/@href']
    paths_2 = ['//div[@class="pic"]/em','//div[@class="hd"]/a/span[1]','//div[@class="star"]/span[@class="rating_num"]','//div[@class="item"]//a/img/@src']

由于需要获取的网页有多个,所以将所有URL放入一个list

从首页解析到的只是URL的尾部,故此处使用了列表生成式将URL补全

    lists = ['https://movie.douban.com/top250/{}'.format(str(x)) for x in get_element(urls[0],paths)[0]]  

将生成的list并入之前首页URL所在的list,便于接下来的处理

    urls.extend(lists)
    dic = []
    for url in urls:
        time.sleep(2)
        # 各元素的列表的集合列表
        element_lists = get_element(url,paths_2)
        nums = element_lists[0]
        names = element_lists[1]
        scores = element_lists[2]
        imgs = element_lists[3]

将每一个电影的信息保存在一个dictionary中

        for i in range(0,len(nums)):
            # 对应电影字典在排名list中的位置
            n = int(nums[i].text)-1
            # 每一条电影的信息保存在一个字典中
            dict_film = {}
            dict_film['num'] = str(n+1)
            dict_film['name'] = names[i].text
            dict_film['score'] = scores[i].text
            dict_film['imgs'] = imgs[i]
            #加入list
            dic.append(dict_film)

将图片保存

    #图片保存的相对路径
    file_path = r"E:\\课件\pic"
    #创建文件夹
    os.makedirs(file_path)
    for d in dic:
        print("%-5s %-5s %-20s"%(d['num'],d['score'],d['name']))
        #改变文件操作状态为file_path路径
        os.chdir(file_path)
        #图片保存的文件名
        file_name = d['name']+ '.' + d['imgs'].split('.')[-1]
        #获取图片的二进制数据
        img = url_open(d['imgs']).content
        #文件的保存操作
        with open(file_name,'wb') as f:
            f.write(img)

整体代码如下

import requests
from lxml import etree
import os
import time


def url_open(url):
    # 网页请求
    web_data = requests.get(url)
    return web_data


def get_element(url,paths):
    # 解析成html格式
    html = url_open(url).text
    # 解析html
    tree = etree.HTML(html)
    tag = []
    for path in paths:
        # 检索特定标签元素
        #将检索结果生成list
        tag.append(tree.xpath(path))
    return tag


def main():
    urls = ['https://movie.douban.com/top250']
    paths = ['//div[@class="paginator"]/a/@href']
    paths_2 = ['//div[@class="pic"]/em','//div[@class="hd"]/a/span[1]','//div[@class="star"]/span[@class="rating_num"]','//div[@class="item"]//a/img/@src']
    lists = ['https://movie.douban.com/top250/{}'.format(str(x)) for x in get_element(urls[0],paths)[0]]
    urls.extend(lists)
    dic = []
    for url in urls:
        time.sleep(2)
        # 各元素的列表的集合列表
        element_lists = get_element(url,paths_2)
        nums = element_lists[0]
        names = element_lists[1]
        scores = element_lists[2]
        imgs = element_lists[3]
        for i in range(0,len(nums)):
            # 对应电影字典在排名list中的位置
            n = int(nums[i].text)-1
            # 每一条电影的信息保存在一个字典中
            dict_film = {}
            dict_film['num'] = str(n+1)
            dict_film['name'] = names[i].text
            dict_film['score'] = scores[i].text
            dict_film['imgs'] = imgs[i]
            #加入list
            dic.append(dict_film)
    #图片保存的相对路径
    file_path = r"E:\\课件\pic"
    #创建文件夹
    os.makedirs(file_path)
    for d in dic:
        print("%-5s %-5s %-20s"%(d['num'],d['score'],d['name']))
        #改变文件操作状态为file_path路径
        os.chdir(file_path)
        #图片保存的文件名
        file_name = d['name']+ '.' + d['imgs'].split('.')[-1]
        #获取图片的二进制数据
        img = url_open(d['imgs']).content
        #文件的保存操作
        with open(file_name,'wb') as f:
            f.write(img)


if __name__ == '__main__':
    main()

不足

缺少容错机制

功能较少

数据结构使用简单


还在学习中,进一步完善。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值