动态网页抓取(爬虫练习写的爬虫代码,如有什么问题和建议?)

优采云 发布时间: 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缺点很多,所以不建议大家爬取数据。

  使用数据:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线