北京网站建设制作,外贸建设网站公司哪家好,黑龙江网站建设企业,wordpress devion当我们想要下载网页的图片时#xff0c;发现网页的图片太多了#xff0c;无从下手#xff0c;那我们写一个脚本来爬取呗。
这次的脚本是专门针对某个外国网站使用的#xff0c;因此仅供参考思路。 在测试的过程中#xff0c;我发现网站使用了发爬虫机制#xff0c;具体就…当我们想要下载网页的图片时发现网页的图片太多了无从下手那我们写一个脚本来爬取呗。
这次的脚本是专门针对某个外国网站使用的因此仅供参考思路。 在测试的过程中我发现网站使用了发爬虫机制具体就是JavaScript动态渲染html代码你中间使用python抓包没有JavaScript渲染过所以BeautiSoup就不能解析HTML里面的img标签中的带有完整图片链接的src属性。
当我们关闭浏览器的JavaScript网页就拒绝显示了因此如何绕过这个是个问题。 实话实说我没从代码层面绕过JavaScript动态渲染但是我们如果在python中加入这个功能的目的是什么不就是为了找到完整的、带有img标签的HTML源码嘛
那我们直接用现有的呗在哪里? 这不就得到了然后我们把这个源码放进一个txt文件中python读取这个文件不就行啦
import requests
from bs4 import BeautifulSoup
import selenium
from selenium import webdriver
import time
import winsound#模拟浏览器行为绕过简单的反爬虫机制
options webdriver.ChromeOptions()
options.add_argument(Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.59 Safari/537.36)
driver webdriver.Chrome(optionsoptions)# 设置代理和自定义请求头因为我爬的是外网所以加了代理
proxies {http: http://192.168.43.244:7890,https: http://192.168.43.244:7890,
}#设置请求头部这里我用burp抓包抓的头部更加模拟真实用户请求
headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.59 Safari/537.36,Accept-Language: zh-CN,zh;q0.8,zh-TW;q0.7,zh-HK;q0.5,en-US;q0.3,en;q0.2,Accept-Encoding: gzip, deflate, br,Upgrade-Insecure-Requests: 1,Sec-Fetch-Dest: document,Sec-Fetch-Mode: navigate,Sec-Fetch-Site: none,Sec-Fetch-User: ?1,Te: trailers,Connection: close,
}# 定义文件图片下载路径
download_folder E:/XXX/YYY/ # 从文件中读取HTML内容这里的111.txt是为了让BeautifulSoup读取的
file_path D:/XXX/111.txt
with open(file_path, r, encodingutf-8) as file:html_content file.read()# 使用 BeautifulSoup 解析HTML内容
soup BeautifulSoup(html_content, html.parser)# 查找所有的img标签并获取其src属性值
img_tags soup.find_all(img)
image_links [tag.get(src) for tag in img_tags]# 定义用于存储访问结果的列表
access_results []# 遍历所有图片链接并尝试访问
for link in image_links:try:response requests.get(link, headersheaders, proxiesproxies)if response.status_code 200:access_results.append(fSuccessfully accessed: {link})#下载图片file_name link.split(/)[-1]# 拼接保存路径save_path download_folder file_namewith open(save_path, wb) as f:f.write(response.content)print(fDownloaded: {file_name})else:access_results.append(fFailed to access: {link}, Status code: {response.status_code})except requests.exceptions.RequestException as e:access_results.append(fFailed to access: {link}, Error: {e})# 输出访问结果
for result in access_results:print(result)
winsound.Beep(1000, 500) # 爬取完毕响铃提示
直接运行可以看到下载成功了当然在运行过程中因为网络问题会出现下载失败的问题可以多运行几次进行覆盖。 虽然这算是个半自动爬虫但是在网页有很多图片的时候会大大提高效率这种手动绕过JavaScript动态渲染也是初学者可以使用的思路。