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()

猜你喜欢

转载自blog.csdn.net/AncenaJune/article/details/114374678