任务概述:pa取某网页下的清晰大图,清晰大图需要从小图预览中获取链接,再进入详情页获取清晰大图的url并抓取下载。
逻辑:先获取预览页面的小图预览的html,爬取进去详情页的url,设置遍历函数,使用request再次请求,获取进去详情页的url,再次爬取页面的html,再次设置一次遍历函数,然后使用pq爬取所需要的大图并使用os保存到本地目录。
1、库import,这里需要三个库
import os
import requests
from pyquery import PyQuery as pq
其中,os是一个用于与操作系统交互的标准库,它提供了一些常用的功能来管理文件和目录,执行系统命令以及访问环境变量等。在本次主要使用os.mkdir()函数创建用于存储爬取文件的文件夹。
在 Python 中,requests 是一个常用的第三方库,用于发送 HTTP 请求。
pyquery 是一个用于解析和处理 HTML/XML 文档的 Python 库。它提供了类似于 jQuery 的语法和 API,使得在 Python 中处理 HTML/XML 文档变得更加方便和简洁。其中pyquery筛选html的一些属性会在下文提及,现在暂时不表。
2、先获取预览页面的小图预览的html,爬取进去详情页的url
def xiao():
url = "https://s网站...."
headers = {
'User-Agent': '自己的爬虫头'
}
r = requests.get(url, headers=headers).content
ret = pq(r)
dev_list = ret('.bot-div').find('a').items() # 获取目标页面class = bot-div属性下的a标签 其中.items表示枚举以下相同标签下的a
3、设置遍历函数,使用request再次请求,获取进去详情页的url,再次爬取页面的html,
for dev in dev_list:
name = dev.text() # 获取名字
# print(name)
img_down = 'https://sc.chinaz.com' + dev.attr('href') # 获取大图url
# print(img_down)
img_down1 = requests.get(img_down, headers=headers).content
ret1 = pq(img_down1)
dev_list_big = ret1('.img-box').find('img').items()
4、再次设置一次遍历函数,然后使用pq爬取所需要的大图并使用os保存到本地目录。
for img in dev_list_big:
img = 'https:' + img.attr('src')
downlown = requests.get(img, headers=headers).content
# 存储
with open(f'大照片/{name}.jpg', 'wb') as f:
f.write(downlown)
5、main函数
if __name__ == '__main__':
xiao()
if not os.path.exists('大照片'):
os.mkdir('大照片')
其中,关于本文中pyquery库方法的使用,
ret1('.img-box').find('img').items()
#。imgbox 查找class=img-box属性的div标签
#.find('img' ) 查找该标签下的img内容
#.在 pyquery 中,items() 方法用于返回 PyQuery 对象中所有匹配元素的生成器。通过迭代生成器,可以遍历 PyQuery 对象中的每个匹配元素,并对其进行操作。
其中,关于
在 pyquery 中,可以使用类选择器来选择具有指定类名的元素。类选择器使用 . 后跟类名的形式进行选择。
find()在pyquery 中,find() 方法用于查找符合选择器的所有后代元素。它会在当前 PyQuery 对象中查找满足指定选择器条件的所有元素,并返回一个新的 PyQuery 对象。
items()在 pyquery 中,items() 方法用于返回 PyQuery 对象中所有匹配元素的生成器。通过迭代生成器,可以遍历 PyQuery 对象中的每个匹配元素,并对其进行操作。
ID 选择器:使用
#
后跟 ID 名称选择元素。示例代码:from pyquery import PyQuery html = ''' <html> <body> <div id="container1"> <h1>Title 1</h1> <p>Paragraph 1</p> </div> <div id="container2"> <h1>Title 2</h1> <p>Paragraph 2</p> </div> </body> </html> ''' doc = PyQuery(html) container = doc('#container1') print(container.text())
- 属性选择器:使用属性名称和值选择具有指定属性的元素。示例代码:
from pyquery import PyQuery html = ''' <html> <body> <div class="container"> <h1>Title 1</h1> <p>Paragraph 1</p> </div> <div class="container"> <h1>Title 2</h1> <p>Paragraph 2</p> </div> </body> </html> ''' doc = PyQuery(html) containers = doc('[class="container"]') print(containers.text())