《python爬虫练习2》爬取网站表情包

news/2024/11/24 1:22:44/

获取网站表情包

运行环境:

#环境:win10
import requests  #发送请求
from lxml import etree  #获取html主页树状代码
import os #创建本地文件夹用来存储图片

1.分析:

目标网址:https://www.runoob.com/
首先想要获取什么就从哪里入手,打开图所在的网页,F12查看代码的内容,此处抓取的是资源文件,爬取中发现ajax类型的文件加载出来的无法知道图片的源地址所以暂时不能用这种方式获取。因此可以生成第一步的代码。

import requesturl  = "https://www.runoob.com/w3cnote/programmer-joke-22.html"
headers = {"User-Agent" :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
res = requests.get(url =url ,headers = headers) #获取了该页面的内容

2.筛选:

获取的内容是整个网页的内容,我们需要筛选出我们需要的东西,这个地方使用到了知识点“xpath
,我们通过HTML的代码已经知道了动态图所放的位置,找到最外层的标签class=“article-intro”,然后获取src对应的地址就可以了

import request
from lxml import etreeurl  = "https://www.runoob.com/w3cnote/programmer-joke-22.html"
headers = {"User-Agent" :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
res = requests.get(url =url ,headers = headers) #获取了该页面的内容
# print(res.text)
tree = etree.HTML(res.text)
# print(tree.xpath("//*[@class='article-intro']/p/@src")) #之前经常用这个方法,出来的往往是空
print(tree.xpath("//div[@class='article-intro']/descendant::*/@src")) #descendant::*表示的是@class='article-intro'标签下面所有

3.范围扩大:

通过上面的设计,我们已经可以获取当前页面的图片的地址了,但是我们应该可以从下面知道这里是有很多页的,这个地方我知道两种方法,一种就是读取下一页标签,结束的时候标签已经是消失的状态,以此来获取下一页的跳转地址。另外一种就是我这次用的目测法,我直接是对比了几个页面的区别,就发现了页面中数字参数就是控制不同页面的。

import request
from lxml import etreeurl  = "https://www.runoob.com/w3cnote/programmer-joke-22.html"
headers = {"User-Agent" :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}for j in range(22,28):url = f"https://www.runoob.com/w3cnote/programmer-joke-{j}.html"res = requests.get(url =url ,headers = headers) #获取了该页面的内容# print(res.text)tree = etree.HTML(res.text)# print(tree.xpath("//*[@class='article-intro']/p/@src")) #之前经常用这个方法,出来的往往是空print(tree.xpath("//div[@class='article-intro']/descendant::*/@src"))

4.存储:

我们已经获取了每个页面的每一条图片的链接,这个时候我们就可以进行图片的存储,无论是图片还是视频这一类的数据都需要通过二进制的形式进行存储,所以写入的时候通常是response.content,这个地方我是首先创建了一个文件夹,然后在此路径下写入图片的数据,因为网站中获取src相关的链接有些许不同,所以我在设计的时候也调整了一下我的代码设计。

import requests
from lxml import etree
import os
url  = "https://www.runoob.com/w3cnote/programmer-joke-22.html"
headers = {"User-Agent" :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
if not os.path.exists('images'):os.makedirs('images')
http = "https:"
for j in range(22,28):url = f"https://www.runoob.com/w3cnote/programmer-joke-{j}.html"res = requests.get(url =url ,headers = headers)# print(res.text)tree = etree.HTML(res.text)# print(tree.xpath("//*[@class='article-intro']/p/@src")) #之前经常用这个方法,出来的往往是空print(tree.xpath("//div[@class='article-intro']/descendant::*/@src"))for i in tree.xpath("//div[@class='article-intro']/descendant::*/@src"):try:if "https"  in i:x = i.split("/")print(x[-1])res = requests.get(url=i, headers=headers)with open(f"images/{x[-1]}","wb") as f:f.write(res.content)elif "//" in i :x = i.split("/")y = x[-1]y = y.replace('"',"")print(x[-1])res = requests.get(url=(http + i), headers=headers)with open(f"images/{y}", "wb") as s:s.write(res.content)else:continueexcept:print("跳过一个异常")

结语:

至此就实现了对于图片的一个获取,这种图片或者文字都是比较好获取的,通过这个方法也可以轻易的获取某些网站的头条热点的文字和链接,也可以用scrapy框架来进行爬取,一般情况下我是习惯先用基础代码捋清思路然后再用框架实现爬取的过程。学习过程中也是发现,部分内容无法通过request的返回值来爬取的,因为这些数据是动态的,虽然可以在F12中看到他们的存在。这种通过ajax生成的内容我们可能需要使用selenium来进行爬取,当然selenium的劣势就是无法在服务器进行部署,只能在有网页实体中获取对应的内容。


http://www.ppmy.cn/news/53584.html

相关文章

大数据专业好找工作么

现在,在数字化转型的推动下,越来越多的企业意识到大数据的魅力,并不断在这个领域投入资金,Python大数据开发相关人才也备受青睐! 学Python之前:这玩意真有传说中那么好么? 学Python之后&#…

Burpsuite双层代理以及抓https与app包设置

Burp Suite是一款用于Web应用程序安全测试的集成式平台。它由PortSwigger Ltd.开发,是一个功能强大的工具,用于发现Web应用程序的漏洞和安全问题,例如跨站点脚本(XSS)、SQL注入、会话劫持等。它包括多个模块&#xff0…

数据库迁移 | DBMotion v23.04 支持异地多活

Squids DBMotion新版本支持异地多中心双活同步了。异地多活支持业务在多个数据中心同时操作数据库,能极大地提升高可用性、容错性和用户体验。其中最关键的技术,无疑是数据同步、同步防环和数据冲突解决。Squids DBMotion通过复制数据打标和预置冲突策略…

TEMPUS FUGIT: 1

环境准备 靶机链接:百度网盘 请输入提取码 提取码:d3du 虚拟机网络链接模式:NET模式 攻击机系统:kali linux 2022.03 信息收集 探测目标靶机开放端口和服务情况。 nmap -p- -A -sV 192.168.255.132 nmap --scriptvuln -p …

基于Stackelberg博弈的光伏用户群优化定价模型(Matlab代码实现)

💥 💥 💞 💞 欢迎来到本博客 ❤️ ❤️ 💥 💥 🏆 博主优势: 🌞 🌞 🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 …

云HIS系统源码,部署云端,支持多租户,实现医疗数据共享与交换

云HIS系统源码,医院信息管理系统源码。采用云端SaaS服务的方式提供,采用前后端分离架构,前端由Angular语言、JavaScript开发;后端使用Java语言开发。 文末获取联系! 基于云计算技术的B/S架构的云HIS系统,采…

nmap常用命令

一、nmap简介 Nmap,也就是Network Mapper。nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一&…

Vue进阶-Vue cli项目搭建、项目基本操作、axios的使用、路由、Vuex

Vue进阶 Vue cli 一、Vue cli 概述 CLI 全称是 Commond Line Interface,翻译为命令行界面,俗称脚手架。VueCLI是一个官方发布vue.js项目脚手架。用VueCLI 可快速搭建Vue开发环境以及对应webpack配置。 二、环境搭建 1、下载 node.js 下载地址&…