动态网页抓取(爬虫练习写的爬虫代码,如有什么问题和建议?)
优采云 发布时间: 2021-10-01 22:07动态网页抓取(爬虫练习写的爬虫代码,如有什么问题和建议?)
前言
我是爬虫代码的初学者,如果有什么问题或者建议,请留言!
一、什么是动态网页?二、具体步骤1. 如何抓取动态网页上的数据 从抓取到的HTML文件分析,我们知道抓取到的文件的URL与页码有关,我们可以遵循规则自己构造一个url来抓取文件(下面的例子就是这种情况);如果从抓取到的HTML文件中发现文件url是固定的或者与页码无关,则只需模拟浏览器点击行为,请求再次抓取网页。这种效率比较慢,不适合多页面爬取。
爬取动态网站的关键是抓包分析。只要能从包中分析出关键数据,剩下的编写爬虫的步骤一般与编写静态网页的步骤相同。
2. 抓取网页数据所需的库 PhatomJS 是一个没有界面的浏览器,用于读取JS加载的页面,具体下载方法可以百度,不是python的第三方库,需要自己下载添加环境变量;当然你也可以使用Chrome、firefox、IE等。Selenium是python的第三方库。命令行输入:pip install selenium download,可以模拟用户在浏览器上进行一些操作。Phatom JS + Selenium 抓取动态网页。使用请求库获取图片。使用beautifulSoup解析抓取到的网页内容。使用os库创建文件并获取文件夹中的文件名列表
代码如下(示例):
import os
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
# 网页url,该url和页码存在规律,下一页的url是将后面的offset=0改为offset=100,具体可自己测试
WEB_URL = 'https://music.163.com/#/artist/album?id=101988&limit=100&offset=0'
# 保存图片的文件夹
FOLDER_PATH = 'D:/BeautifulPicture'
# 应对服务器反爬机制(会根据User-Agent辨别是浏览器访问还是代码访问,代码访问会被拒绝,所以需要使用headers伪装一下)的请求头,这里我们用的是PhatomJS浏览器,所以不需要
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
class AlbumCover:
def __init__(self):
self.web_url = WEB_URL
self.folder_path = FOLDER_PATH
self.headers = HEADERS
def request(self, url):
r = requests.get(url)
return r
def save_img(self, url, file_name):
print("开始请求图片地址……")
img = self.request(url)
print("开始保存图片……")
f = open(file_name, 'wb')
f.write(img.content)
print(file_name, "图片保存成功")
f.close()
def mkdir(self, path):
# self.is_folder_new
path = path.strip()
if not os.path.exists(path):
print("创建名字叫" + path + "的文件夹")
os.mkdir(path)
print("创建成功")
return True
else:
print("文件已经存在,不用创建")
return False
def spider(self):
print("Start")
# 使用selenium驱动PhantomJS进行网络请求
driver = webdriver.PhantomJS()
driver.get(self.web_url)
# 该网页使用了iframe框架,需要switch一下
driver.switch_to.frame("g_iframe")
# 根据驱动器获取网页源码
html = driver.page_source
self.mkdir(self.folder_path)
print('开始切换文件')
os.chdir(self.folder_path)
# 使用BeautifulSoup来对html进行解析,根据网页的开发者页面可以查到所有图片都在标签下,每个图片的标签是
all_li = BeautifulSoup(html, 'lxml').find('ul', class_="m-cvrlst m-cvrlst-alb4 f-cb").find_all('li')
for li in all_li:
album_url = li.find('img')['src']
album_name = li.find('p', class_='dec dec-1 f-thide2 f-pre')['title']
album_date = li.find('span', class_='s-fc3').text
# 将url后拼接的长宽去掉
index = album_url.index('?')
album_url = album_url[:index]
# 图片命名
photo_name = album_date + '-' + album_name.replace('/', '').replace(':', ',') + ".jpg"
# os.listdir(path)返回文件夹底下的全部文件
# 是一个去重操作
if photo_name in os.listdir(self.folder_path):
print("图片已经存在,继续下一个")
else:
self.save_img(album_url, photo_name)
driver.close()
if __name__ == '__main__':
get = AlbumCover()
get.spider()
3.运行结果
文件夹中保存的图片:
这里使用的 url 网络请求的数据。
总结
selenium 和 requests 的比较:
1、速度慢。每次运行爬虫时,都会打开一个浏览器。如果没有设置,会加载很多图片,JS等;
2、 占用资源过多。有人说把Chrome改成无头浏览器PhantomJS,原理是一样的。就是打开浏览器,很多网站都会验证参数。如果对方看到你在用 PhantomJS 访问,就会被封禁。您的请求,然后您必须考虑更改请求标头。我不知道事情有多复杂。为什么要学习 Python?因为Python简单,如果有更快更简单的库可以实现同样的功能,何乐而不为呢?
3、 对网络的要求会更高。Selenium 加载了很多可能对您没有价值的补充文件(例如 css、js 和图像文件)。这可能会产生更多的流量,而不仅仅是请求您真正需要的资源(使用单独的 HTTP 请求)。
4、 爬网规模不能太大。
5、困难。学习Selenium的成本太高了,
通过对比可以看出requests在代码上简洁,不难操作,而selenium缺点很多,所以不建议大家爬取数据。
使用数据: