【1】首先需要准备好pycharm,并且保证环境能够正常运行
【2】安装request模块
pip install requests
import request
导入request内置模块
【3】安装lxml模块
pip install lxml
from lxml import etree
导入lxml.etree内置模块
如果导入etree失败的话可以尝试
from lxml import html
etree = html.etree
今日的目标是爬取图片信息
网址:[loryx.wiki]([home LoR丨中文百科] (loryx.wiki))
该部分是这次要爬取的所有图片内容,首先F12打开网络并且选中ALL,然后Ctrl+R刷新页面
打开最上方加载的文件的Response,发现和页面的源码非常相似,并且编码类型为utf-8
接着点开Headers
可以看到该网页是GET类型,并且状态码是200,URL也和该页面相同
那么接下来就可以用python来模拟request请求了
其实GET方法在这里data不带进去也行,写在这里是为了更方便理解
import requests
from lxml import etree
url = 'https://loryx.wiki/%E6%B5%8F%E8%A7%88/%E7%89%8C%E5%BA%93'
data = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/231.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/231.36 Edg/120.1.1.0'
}
res = requests.get(url=url, data=data)
res.encoding = 'utf-8'
接下来拿到了request对象后就可以来对元素进行筛选了
首先获取完整的网页源码print(res.text)
打印结果为
可以看见没有问题,那么继续用etree进行解析
et = etree.HTML(res.text)
继续分析网页内容
在图片链接处右键进入检查
然后我们就得到了标签页信息,我们将要获取的就是td标签中的col15 leftalign元素中的a标签的href链接信息,于此同时我们还需要对应的内容来作为图片的名称,否则你将会看到一堆乱码的哈希值
这里就用卡牌名称作为图片名,取元素的方法也和图片同理
# 图片链接
src = et.xpath("//td[@class='col15 leftalign']/a/@href")
# 图片名称
name = et.xpath("//td[@class='col0 leftalign']/text()")
当前所有采集到的内容都存储在src
,name
这两个列表中
我们打印src就可以看到这样的图片链接
打开后就可以在浏览器中看到图片
该效果说明我们下载图片的原理还是向这个网页发送请求然后再获取返回的结果
演示只取9张图片,不然的话可以直接range(len(src))
for i in range(9):
with open(f"img/{name[i]}.png", 'wb') as f:
f.write(requests.get(src[i]).content)
这里需要注意要用wb
,因为写入的是二进制数据
运行程序
OK完工
以上就是python中最基础的爬虫案例,当然实际项目中基本不会有用with open(f"img/{name[i]}.png", 'wb') as f:
这种写法,因为效率太低了,本篇文章只是为了以最直观的方式呈现爬虫下载图片的原理
完整代码:
import requests
from lxml import etree
url = 'https://loryx.wiki/%E6%B5%8F%E8%A7%88/%E7%89%8C%E5%BA%93'
data = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'
}
res = requests.get(url=url, data=data)
res.encoding = 'utf-8'
et = etree.HTML(res.text)
# print(res.text)
src = et.xpath("//td[@class='col15 leftalign']/a/@href")
name = et.xpath("//td[@class='col0 leftalign']/text()")
for i, index in enumerate(name):
name[i] = index.strip()
for i in range(9):
with open(f"img/{name[i]}.png", 'wb') as f:
f.write(requests.get(src[i]).content)