Python脚本可以实现数据的爬取,而XML可以解析网页数据。将Python爬虫脚本与XML解析功能相结合,可以实现自动保存某商城的商品图功能。
注:本功能仅用于学习爬虫功能写Demo使用,严禁用于商业用途,且不可频繁使用以免对远程服务器造成攻击。
整个过程分为三步,分别是:创建图片保存目录、组装数据发送请求、接收并解析数据
首先判断目录是否存在,不存在则创建,代码如下:
import os
file_path = r"./商品文件夹/"
if not os.path.exists(file_path):
os.mkdir(file_path)
定义一个下载函数,使用requests包来发送请求。接收请求后使用open函数获取图片内容,然后将图片内容写入到文件中。
import requests
# 下载函数
def img_down(img_url):
img_name = file_path + "/" + img_url.split('/')[-1]
r = requests.get(img_url, headers=headers, verify=False)
with open(img_name, 'wb') as f:
f.write(r.content)
f.close
使用for
循环来控制页码数;使用变量page
来实现页码的自动增加;使用requests
来发送请求数据,使用etree
来解析捕捉到的HTML数据。为了防止访问过快,还可以使用time.sleep()
函数来实现间隔请求,避免访问过快导致IP被封。
import os
import requests
import time
from lxml import etree
import warnings
warnings.filterwarnings('ignore')
def get_details():
for i in range(1, 51): # 页数循环
page = f'&page={i}' # 翻页参数
# 商品链接地址
url = "XXX"
url = url + page
res = requests.get(url, headers=headers, verify=False).text
# print(res)
tree = etree.HTML(res)
# print(res)
li_list = tree.xpath('//*[@id="J_goodsList"]/ul/li')
# print(li_list)
# exit()
for j in li_list:
img_url = 'http:' + j.xpath('./div/div/a/img/@data-lazy-img')[0]
# print(img_url)
img_down(img_url)
print("图片下载成功,图片链接: " + img_url)
time.sleep(100)
print("======第" + str(i) + "页的照片全部下载完成======")
print("执行结束")
代码如下,可直接拿来使用。必要时替换headers和商品的url链接即可。
import os
import requests
import time
from lxml import etree
import warnings
warnings.filterwarnings('ignore')
# 创建目录
file_path = r"./商品文件夹/"
if not os.path.exists(file_path):
os.mkdir(file_path)
# headers
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"user-agent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36",
}
# 下载函数
def img_down(img_url):
img_name = file_path + "/" + img_url.split('/')[-1]
r = requests.get(img_url, headers=headers, verify=False)
with open(img_name, 'wb') as f:
f.write(r.content)
f.close
#
def get_details():
for i in range(1, 51): # 页数循环
page = f'&page={i}' # 翻页参数
# 商品链接地址
url = "XXX"
url = url + page
res = requests.get(url, headers=headers, verify=False).text
# print(res)
tree = etree.HTML(res)
# print(res)
li_list = tree.xpath('//*[@id="J_goodsList"]/ul/li')
# print(li_list)
# exit()
for j in li_list:
img_url = 'http:' + j.xpath('./div/div/a/img/@data-lazy-img')[0]
# print(img_url)
img_down(img_url)
print("图片下载成功,图片链接: " + img_url)
time.sleep(100)
print("======第" + str(i) + "页的照片全部下载完成======")
print("执行结束")
if __name__ == '__main__':
# 执行程序
get_details()