当前位置: 首页 > news >正文

《0基础》学习Python——第二十二讲__网络爬虫/<5>爬取豆瓣电影封面图

一、爬取豆瓣电影的图片封面

        1、经过上节课我们所爬取的豆瓣电影的电影名、年份、国家、导演、主演、剧情,那么接下来我们将学习如何去爬取这些电影的图片,并将这些图片存放在文件夹中。

        2、过程实现:

        2.1、获取网页源码

        首先还是和爬取电影名一样,先从网页获取到URL、然后再发送get请求、进行UA伪装,此处的代码如下:

if __name__ == '__main__':# UA伪装head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'}# 获取urlurl = 'https://movie.douban.com/top250'# 发送请求response = requests.get(url, headers=head)# 返回数据类型cont_text = response.textprint(cont_text)#打印数据,用于查看是否爬取成功

       此时有打印结果说明获取网页信息成功,接下来继续对这段长数据进行处理

注意:部分网页需要登录账号才能爬取,此时需要在URL那一栏找到Cookie

53e60b2071684a658acbbf0632dd7f0d.png

       

        复制这段Cookie所对应的内容,将它增加到head里面去,如下列代码

# UA伪装head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0','Cookie':"ll="118183"; bid=H3WRaEnQCkI; _pk_id.100001.4cf6=5df013865257fa4c.1721368722.; __yadk_uid=rm8FHEGxJVSUzh7rJTZUbbphUwvgHrjb; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1721535985%2C%22https%3A%2F%2Fcn.bing.com%2F%22%5D; __utma=30149280.1409929673.1721368655.1721448364.1721535985.8; __utmc=30149280; __utma=223695111.1684481215.1721368722.1721448364.1721535985.5; __utmc=223695111"}

Cookie:用于记录用户的个人偏好和行为,例如登录信息、购物车内容、网站语言等。它们还可以用于跟踪用户的浏览行为和收集统计信息,以便网站可以优化用户体验和提供相关的广告。此为用户私密信息,不要随意传播

        

        2.2、找到图片所对应的标签位置

9e7693f18c18452db5b3872f2a4437c0.png

        2.2.1、定位所需内容所处标签位置

        用以下代码直接定位到 li 标签位置,并获取所有的 li 标签信息

cont_text = response.text# print(cont_text)#打印数据,用于查看是否爬取成功#对得到的数据进行解析tree=etree.HTML(cont_text)# print(tree)#获取所有的li标签lis_li=tree.xpath("//ol[@class='grid_view']/li")# print(lis_li)

其打印结果为element对象:

b2f73dbc8a9f4b3aa1bb69f29a20b7d7.png

        2.2.2、获取图片的URL:

    for li in lis_li:#对单个li标签进行xpath处理#xpath返回列表,用join去除列表img_url="".join(li.xpath('./div/div[1]/a/img/@src'))print(img_url)

即获取所有li标签,然后再通过xpath获取到图片的URL:

其打印结果为:

af7466414acb4917a2475731964a912b.png

2.3、通过图片URL获取图片的二进制数据

有了图片的URL即可再通过get请求得到图片的二进制数据,因为图片是以二进制数据的类型存放,代码如下

img_url="".join(li.xpath('./div/div[1]/a/img/@src'))# print(img_url)#发送get请求img_response=requests.get(img_url,headers=head)#获取图片的二进制数据img_con=img_response.content#此处img_response.content没有用text是因为图片数据是二进制print(img_con)

其打印结果为二进制数据:530eedd281264a48b4d51b73e4d42548.png

2.4、存放图片到文件夹

        将获取的图片信息分别写入文件,存放在文件夹中,将图片名后缀名改为JPG格式即可完成图片的爬取

2.4.1  导入一个库用来创建文件夹来存放图片

import os.path

其创建方式为:

import os.pathos.mkdir('./film_pic') #此处为在当前代码同级目录下创建一个名为film_pic的文件夹

2.4.2 创建图片文件

命名图片名后,以二进制模式写入图片二进制编码数据:

with open(f'./film_pic/{i}.jpg','wb') as fp:fp.write(img_con)

2.5 爬取成功图片

b8565e99d0d44b01b7b6373c4d545818.png

二、完整代码实现

import os.path #导入包用来创建新的文件夹
import requests
from lxml import etreeif __name__ == '__main__':# UA伪装head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'}# 获取urlurl = 'https://movie.douban.com/top250'# 发送请求response = requests.get(url,headers=head)# 返回数据类型cont_text = response.text# print(cont_text)#打印数据,用于查看是否爬取成功#对得到的数据进行解析tree=etree.HTML(cont_text)# print(tree)#获取所有的li标签lis_li=tree.xpath("//ol[@class='grid_view']/li")# print(lis_li)#将每一条li标签分别提取出来os.mkdir('./film_pic') #创建同级文件夹用来存放图片文件i=0for li in lis_li:#对单个li标签进行xpath处理#xpath返回列表,用join去除列表img_url="".join(li.xpath('./div/div[1]/a/img/@src'))# print(img_url)#发送get请求img_response=requests.get(img_url,headers=head)#获取图片的二进制数据img_con=img_response.contentprint(img_con)with open(f'./film_pic/{i}.jpg','wb') as fp:fp.write(img_con)i=i+1

三、随机生成UA标识

import fake_useragent#随机生成浏览器标识,其中包括window、mac、Android、iOS系统
head={'User-Agent':fake_useragent.UserAgent().random
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • uniapp封装请求拦截器,封装请求拦截和响应拦截的方法
  • c# 一个自定义日志类
  • 【JAVA 常用API】数据库字段存储JSON格式数据,JAVA中如何将List<Entity>或者对象实体转换为字符串
  • Linux shell编程学习笔记65: nice命令 显示和调整进程优先级
  • linux文本查看命令
  • 概率论原理精解【1】
  • 基于YOLO8的目标检测系统:开启智能视觉识别之旅
  • 【Linux】Linux的基本使用
  • 开源防病毒工具--ClamAV
  • linux 报错:bash: /etc/profile: 行 32: 语法错误:未预期的文件结束符
  • css性能优化的方法
  • 如何判断国民经济的好坏
  • 北京交通大学《深度学习》专业课,实验3卷积、空洞卷积、残差神经网络实验
  • 基于trace_id实现SpringCloudGateway网关的链路追踪
  • 比较 WordPress 、 Baklib 和 BetterDocs
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • ES2017异步函数现已正式可用
  • laravel5.5 视图共享数据
  • LintCode 31. partitionArray 数组划分
  • mysql常用命令汇总
  • nodejs实现webservice问题总结
  • Odoo domain写法及运用
  • vagrant 添加本地 box 安装 laravel homestead
  • Vue 重置组件到初始状态
  • 搭建gitbook 和 访问权限认证
  • 给初学者:JavaScript 中数组操作注意点
  • 计算机在识别图像时“看到”了什么?
  • 区块链将重新定义世界
  • 如何进阶一名有竞争力的程序员?
  • 网页视频流m3u8/ts视频下载
  • 无服务器化是企业 IT 架构的未来吗?
  • 用 Swift 编写面向协议的视图
  • 转载:[译] 内容加速黑科技趣谈
  • 【干货分享】dos命令大全
  • 【云吞铺子】性能抖动剖析(二)
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • kubernetes资源对象--ingress
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 带你开发类似Pokemon Go的AR游戏
  • 如何正确理解,内页权重高于首页?
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​Linux·i2c驱动架构​
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #{}和${}的区别是什么 -- java面试
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #Spring-boot高级
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2)(2.10) LTM telemetry
  • (2)MFC+openGL单文档框架glFrame
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (C++)八皇后问题