210304课 爬取动态页面

210304课 爬取动态页面

爬取网页上的动态内容
即网页上可以看到,一般却不显示数据代码的内容
又称瀑布式加载,触底加载

1, Ajax > 为页面提供动态生成内容的一种技术
> 浏览器可以在不中断用户体验的前提下,向服务器发起异步请求
> 在浏览器后台发生,用户感知不到
> 服务器在收到浏览器发出的异步请求后会以Json格式返回数据
> 浏览器获得Json数据后,会使用javascript对页面进行局部渲染,生成动态内容
2,抓取动态内容方法:

  1. javascript逆向

    在浏览器的开发者工具中截获异步请求,找到获取数据的url
    开发者工具 > Network > XHR > response

  2. 专业抓包工具

    Charles 花瓶
    Fiddler
    Wireshark

  3. Python程序驱动浏览器工作,直接获取
    需要三方库selenium的支持,此库被广泛应用于自动化测试

selenium IDE:浏览器插件 >可以录制用户操作然后重复播放
selenium WebDriver:驱动浏览器 >模拟用户操作
selenium Remote Control:多机控制

在pycharm终端安装三方库: pip install selenium

实例1:爬取360上面的美女图片
# 此处介绍2种获取方法
# 方法一:javascript逆向
# 导入所需模块
import bs4
import requests

# 定义一个从url获取图片到文件夹的函数
def download_picture(url):
    resp = requests.get(url)
    filename = url[url.rfind('/') + 1:]
    # 设置一个文件夹
    with open(f'image360/{filename}', 'wb') as file:
        file.write(resp.content)


def main():
    resp = requests.get('https://image.so.com/zjl?ch=beauty&sn=30')
    data_dict = resp.json()
    for image_dict in data_dict['list']:
        url = image_dict['qhimg_url']
        download_picture(url)

if __name__ == '__main__':
    main()
    
# 方法二:Python程序驱动浏览器工作,直接获取
'''
如果此处运行报错,说明没有驱动,需安装镜像驱动
淘宝镜像驱动
http://npm.taobao.org/mirrors/chromedriver
> 选择与系统版本相近的版本IP下载
> 移到pycharm的scripts下面
'''
# 导入三方库模块
from selenium import webdriver

# 创建浏览器对象
browser = webdriver.Chrome()
# 指定url加载页面 >获取360美女图片
browser.get('https://image.so.com/z?ch=beauty')
# 设置一个隐式等待时间(即获取元素时,如果元素暂时还没出来,可以指定等待时间)
browser.implicitly_wait(10)
# 通过浏览器对象的find_elements_by_xxx方法获取页面元素
imgs_list = browser.find_elements_by_tag_name('img')
for img in imgs_list:
    # 如果要获取标签里面的内容可以使用标签对象(webelement)的text属性
    # 如果要获取的是标签的属性,可以使用标签对象的get_attribute方法
    print(img.get_attribute('src'))

模拟用户输入指令
实例:搜索360上的治愈系图片
# 导入模块
from selenium import webdriver

# 1. 创建浏览器对象
browser = webdriver.Chrome()
# 2. 指定URL加载页面
browser.get('https://image.so.com/')
# 通过ID获取页面元素(输入框)
kw_input = browser.find_element_by_id('search_kw')
# 模拟用户输入行为
kw_input.send_keys('治愈')
# 通过CSS选择器获取页面元素按钮
search_button = browser.find_element_by_css_selector('button[type="submit"]')
# 模拟用户输入点击行为
search_button.click()
# 设置一个隐式等待时间(当你获取元素的时候,如果元素暂时还没有出来,可以等待指定的时间)
browser.implicitly_wait(10)
# 3. 通过浏览器对象的find_elements_by_xxx方法获取页面元素
imgs_list = browser.find_elements_by_tag_name('img')
for img in imgs_list:
    # 4. 如果要获取标签里面的内容可以使用标签对象(WebElement)的text属性
    # 如果要获取的是标签的属性,可以使用标签对象的get_attribute方法
    print(img.get_attribute('src'))
启用无头浏览模式

作用:可以直接生成文件夹保存,需要的时候直接调用文件夹即可,不需要在显示器上打开网页

例子:提取百度上的Python搜索界面,以图片格式保存
# 导入相关模块
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions

from selenium.webdriver.support.wait import WebDriverWait

# 通过ChromeOptions对象可以指定启动浏览器时用到的参数
options = webdriver.ChromeOptions()
options.add_argument('--headless')
browser = webdriver.Chrome(options=options)
# 设置浏览器窗口尺寸
browser.set_window_size(1280, 960)
browser.get('https://www.baidu.com/')
browser.implicitly_wait(10)
kw_input = browser.find_element_by_css_selector('#kw')
kw_input.send_keys('Python')
kw_input.send_keys(Keys.ENTER)
# 用显式等待的方式等结果加载出来
wait = WebDriverWait(browser, 10)
# 通过WebDriverWait对象的until方法设置等待的期望条件
wait.until(expected_conditions.presence_of_element_located(
    (By.CSS_SELECTOR, 'div.result')
))
# 为浏览器窗口生成一个快照并保存成图片文件
browser.get_screenshot_as_file('results.png')
# 关闭浏览器窗口
browser.close()
处理网站会识别selenium问题
# 提取百度上的Python搜索界面,以图片格式保存
# 导入相关模块
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions

from selenium.webdriver.support.wait import WebDriverWait

# 通过ChromeOptions对象可以指定启动浏览器时用到的参数
options = webdriver.ChromeOptions()
# 关掉浏览器窗口上方显示的'Chrome正受到自动测试软件的控制'
# 不用 options.add_argument('--headless')
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
browser = webdriver.Chrome(options=options)
# 执行谷歌开发者协议命令在加载新页面时执行指定的JavaScript代码
browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
# 设置浏览器窗口尺寸
browser.set_window_size(1280, 960)
browser.get('https://www.baidu.com/')
browser.implicitly_wait(10)
kw_input = browser.find_element_by_css_selector('#kw')
kw_input.send_keys('Python')
kw_input.send_keys(Keys.ENTER)
# 用显式等待的方式等结果加载出来
wait = WebDriverWait(browser, 10)
# 通过WebDriverWait对象的until方法设置等待的期望条件
wait.until(expected_conditions.presence_of_element_located(
    (By.CSS_SELECTOR, 'div.result')
))
# 为浏览器窗口生成一个快照并保存成图片文件
browser.get_screenshot_as_file('results.png')
# 关闭浏览器窗口
browser.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Jsoup是一个用于处理HTML文档的Java库,它可以轻松地从HTML文档中提取数据。但是,如果你需要爬取动态页面,使用Jsoup就会遇到一些问题,因为Jsoup只能获取静态HTML页面,无法处理动态页面。 对于动态页面,你需要使用其他工具,如Selenium WebDriver。Selenium WebDriver是一个自动化测试工具,可以模拟用户在浏览器中的操作,包括点击按钮、输入文本、滚动页面等。通过使用Selenium WebDriver,你可以模拟用户操作来获取动态页面。 以下是使用Selenium WebDriver和Jsoup来爬取动态页面的步骤: 1. 使用Selenium WebDriver打开网页,并模拟用户操作获取动态页面。 2. 使用Jsoup解析获取到的HTML文档,提取所需数据。 下面是一个示例代码,演示如何使用Selenium WebDriver和Jsoup来爬取动态页面: ``` // 导入相关的包 import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class DynamicPageScraper { public static void main(String[] args) { // 设置ChromeDriver路径 System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver"); // 创建ChromeDriver实例 WebDriver driver = new ChromeDriver(); // 打开网页 driver.get("https://example.com"); // 模拟用户操作,例如点击按钮,输入文本等 WebElement button = driver.findElement(By.id("button")); button.click(); // 获取动态页面HTML文档 String html = driver.getPageSource(); // 使用Jsoup解析HTML文档,提取所需数据 Document doc = Jsoup.parse(html); // TODO: 提取数据的代码 // 关闭ChromeDriver driver.quit(); } } ``` 在上面的示例代码中,我们使用了ChromeDriver打开网页,并模拟了用户操作来获取动态页面。然后,我们使用Jsoup解析HTML文档,提取所需数据。最后,我们关闭ChromeDriver。 需要注意的是,我们需要下载ChromeDriver并设置其路径。另外,我们还需要导入相关的包。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值