基于Python抓取电影天堂数据

在这里插入图片描述

一、开头

在花了近半年的课余时间学习了Python的基础语法后开始尝试网页的抓取,学了一个星期,刚开始的抓取比较小的网页尝到甜头后,疯狂的找各种网页抓取,当然也被各种虐得反爬虐 - -!

于是决定认真复习之前的笔记,把爬取过的网页及方法记录下来,写博客有助于自己后面的复习,当然如果有爬虫比我还小白的朋友看我的这些基础可能也会收获点 ~

二、工具(Python)所依赖的库

  1. requests
  2. xpath

三、目标确定

抓取2019精品新片的前10页所有电影的名字、电影海报(感兴趣的可以加入磁力链接,同理不难)

三、url分析和总体层次分析

在这里插入图片描述
爬取思路层次分析——从里向外:

  1. 解析单个电影url取出电影名、电影海报。定义一个def,返回需求
  2. 抓取一页中的所有电影的url。定义一个def,输入那一页的total_url,返回一个urls列表,然后遍历urls,将url扔进1的函数中
  3. 遍历10页,定义主函数结合1、2函数

url分析
进入单部电影的页面中右键点击检查,从elements里很容易找出电影名和海报的位置
在这里插入图片描述

在这里插入图片描述
电影名有很多个地方都能提取,不一一说明

通过xpath语法解析出
在这里插入图片描述
可以看到xpath匹配出两个图片信息,第二个是视频截图的,我们只需要第一个即可。

total_url分析
提取完单个电影所需要的信息后,分析如何从一页里面如何抓取所有的电影url,已第一页为例,目标抓提取出第一页所有的url
在这里插入图片描述

右键点击检查,将elements定位工具放置任意一个电影位置,可找出如下在这里插入图片描述
在这里插入图片描述
这样就发现除了每个电影url位置了,再通过xpath匹配出来
在这里插入图片描述
OK,此时可以说已经完成将一页(total_urls)中的所有url里的电影需求信息拿到手了。
下一步就是分析爬取10页的了。

遍历10页分析
在这里插入图片描述
在这里插入图片描述

此时观察前两页的url可发现规律了吧,只需要将圆圈处作为偏移量即可完成需求。好了,分析完毕。
代码实现:
放代码前需要注意的是:我们都知道requests请求下来后一般用response.text 或者 response.content ,这里我选用第二个,电影天堂这个的源代码不够规范,所以我们手动进行解码,打开一个电影url的源代码,ctrt+F 输入 ‘charset’ 可以发现如下图
在这里插入图片描述
该网页由gbk编码,那我们解码时使用decode(‘gbk’)就行啦。

代码如下

# -- 1  对电影天堂url规律分析

from  lxml import etree
import requests
x = 0
y = 0
movies = []


HEARDERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                  '(KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
    'Accept-Language':'zh-CN,zh;q=0.9'
}
frist = 'https://www.dytt8.net'

def get_detail_urls(url):
    """获取一页的电影"""
    global y
    response = requests.get(url, headers=HEARDERS)

    text = response.text  # 去网页源代码查看编码方式
    html = etree.HTML(text)  # 解析成HTML代码对象

    detail_urls = html.xpath("//table[@class='tbspan']//a/@href")  # 返回list

    detail_urls = map(lambda url:frist+url,detail_urls) # 将每个detail_urls元素都放进lambad函数里面执行一遍

    y += 1
    print('='*30)
    print('第{}页开始爬取!'.format(y))
    print('=' * 30)
    return detail_urls



def parse_detail_page(url):
    global x
    movie={}

    response = requests.get(url,headers=HEARDERS)
    text = response.content.decode('gbk')
    html = etree.HTML(text)

    title = html.xpath("//div[@class='title_all']//font/text()")[0]  # 电影名
    img = html.xpath("//p/img/@src")[0]

    movie['电影名'] = title
    movie['海报'] = img

    x += 1
    movies.append(movie)
    print('第{}部电影爬取完毕!'.format(x))



def main():
    """爬取前5页"""
    global x
    for i in range(1,11):   # 控制页数

        url = 'https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html'.format(i)
        detail_urls = get_detail_urls(url)   # return详细电影页面list

        for detail_url in detail_urls:
            # 该for循环遍历一页中所有电影的详情
            try:
              movie = parse_detail_page(detail_url)      # 处理单个电影url
            except:
                print('爬取失败')
                x += 1




if __name__ == '__main__':
    main()
    print('爬取完毕,共{}部电影'.format(x))
    print(movies)






结果如下,就不做数据存储环节,主要为理清爬虫思路
在这里插入图片描述

在期间某个电影返回了索引错误, - -~ 于是又花了几分钟看了下那部电影,检查发下如下:
在这里插入图片描述

果然是空的索引!!! - - 无语 ,那就加了个 try,except, 结果如下:

在这里插入图片描述

爬取完成!
在这里插入图片描述
更多原创文章请关注我的公众号:DataUser
一枚数据分析的爱好者~
在这里插入图片描述

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值