文章目录
- 手把手教你爬某站图片
- 代码前的准备
- 代码部分
- 作者寄语
手把手教你爬某站图片
代码前的准备
演示网址
<a href="https://pic.sogou.com/d?query=%E4%BA%8C%E6%AC%A1%E5%85%83%20%E6%83%85%E4%BE%A3%E5%A4%B4%E5%83%8F%20%E4%B8%80%E5%B7%A6%E4%B8%80%E5%8F%B3"></a>
- 按下F12键,部分windows系统需要按下 Fn + F12 找到network
你会发现里面是这样的 ,不要紧,F5刷新一下,数据包就出来了我们点击第一个包
找到response 为了看得更加方便,我们点击下面的 {} 将html代码格式化
另外为了方便提取数据 右击空白处,选择在源面板打开
接下来按下ctrl + f 搜索img 找图片,通过规律我们发现img-height这个class频繁出现,网页内大概有50个左右,因此我们翻一个网页,这个网页会显示给我们它之后的五十张图片的信息,这为翻页操作的参数打下了基础,我们不妨打开它的类似于网址的部分看看(复制drag-img后的url,复制url的路径) 在新的浏览器粘贴·
如果你看到类似于作者的图片 恭喜你成功了
这个时候我们返回Network 找到第一个包的Headers,寻找我们需要的信息
url 和 user-agent
我们回到作者给的这个网址
<a href="https://pic.sogou.com/d?query=%E4%BA%8C%E6%AC%A1%E5%85%83%20%E6%83%85%E4%BE%A3%E5%A4%B4%E5%83%8F%20%E4%B8%80%E5%B7%A6%E4%B8%80%E5%8F%B3"></a>
将图片翻页操作
发现url的变化
翻页前:https://pic.sogou.com/d?query=二次元%20情侣头像%20一左一右&did=1
翻页后:https://pic.sogou.com/d?query=二次元%20情侣头像%20一左一右&did=2
仅仅是did发生变化 因此我们可以模拟翻页操作爬取多张
代码部分
import requests
# 发送请求模块
import os
# 路径转存模块
from lxml import etree
# 使用xpath提取
import time
# 导入时间模块的目的是为了减缓爬虫速度,避免反爬
class Bizhi():
src_array = []
# 这个数组用来存储图片的网页所在,我们将对这里的元素发送请求获取图片
def __init__(self, id):
self.id = id
# id 就是上文提到的did的参数,设置不同的id可以爬的图片数量不同
self.url = f'https://pic.sogou.com/d?query=%E4%BA%8C%E6%AC%A1%E5%85%83%20%E6%83%85%E4%BE%A3%E5%A4%B4%E5%83%8F%20%E4%B8%80%E5%B7%A6%E4%B8%80%E5%8F%B3&forbidqc=&entityid=&preQuery=&rawQuery=&queryList=&st=&did={id*50}'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'
}
def get_res(self):
# 获取响应
self.text = requests.get(self.url, headers=self.headers).content.decode()
html = etree.HTML(self.text)
# xpath语法提取属性
src = html.xpath(".//a[@class='img-height']//img/@drag-img")
for i in src:
# 所爬到的src的每个元素类似于这种样子
# '//img01.sogoucdn.com/v2/thumb/crop/xy/ai/w/60/h/60?appid=122&url=https://i02piccdn.sogoucdn.com/c1094bb21f54f2f2'
# 我们将src每个元素用=将其分割(split方法)开来每个元素就成了这个样子 是一个列表
# ['//img02.sogoucdn.com/v2/thumb/crop/xy/ai/w/60/h/60?appid', '122&url', 'https://i02piccdn.sogoucdn.com/6293cb571ce30968']
# 列表的第二个数据就是我们想要的
self.src_array.append(i.split('=')[2])
def save_src(self):
# 保存图片到本地
flag = 1
for i in self.src_array:
with open(f'D:/爬虫用/爬虫3/壁纸图片/bizhi{self.id}-{flag}.jpg', 'wb') as f:
f.write(requests.get(i, headers=self.headers).content)
time.sleep(0.5)
flag += 1
print(f'bizhi{self.id}-{flag}保存')
def run(self):
self.get_res()
self.save_src()
# 我们以id=1为例,就是五十张 爬到1*50 = 50张图片
test1 = Bizhi(1)