网络爬虫爬取动态网页数据

目录

一、导学与指南

豆瓣单页分析

豆瓣多页输出

二、理论学习

1.抓取动态网页的技术

2.Selenium和WebDriver的安装与配置

3.Selenium的基本使用

三、小结


一、导学与指南

豆瓣单页分析

import json
 
import requests
 
# 基础URL 不顶事了
url_base="https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action="
 
#经过分析的 动态内容url 才是我们要的结果
url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=20&limit=20"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',
    'Cookie': 'bid=hCw6GK7T3ko; _pk_id.100001.4cf6=e05499d4844cbfde.1697382901.; __yadk_uid=Y0K7d13OW6bvDo7Rfg4GEhEopPLKv9Vk; ll="118303"; _vwo_uuid_v2=D116B2284E0415DE6F0E8E62C0F3F1B7C|dbd80bec580d442e73cbc806b51e709a; ct=y; douban-fav-remind=1; __utmc=30149280; __utmz=30149280.1698504570.8.7.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmc=223695111; __utmz=223695111.1698504570.7.6.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; Hm_lvt_16a14f3002af32bf3a75dfe352478639=1698504600; Hm_lpvt_16a14f3002af32bf3a75dfe352478639=1698504600; ap_v=0,6.0; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1698558921%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DxUZ2pFPHLGI9UjAZ5BVOkGTqzr9mirz0hM9tSnQ4LgGBvkpYQRkEaveglj68M1Hs%26wd%3D%26eqid%3Dbd0c500a000673f800000006653d1f77%22%5D; __utma=30149280.1569954803.1697382901.1698557082.1698558922.11; __utma=223695111.1379090793.1697382901.1698557082.1698558922.10'
}
# # 1、查看url_base返回结果
# result_base = requests.get(url_base, headers=headers)
# # print(result_base.apparent_encoding) # utf-8
# # print(result_base.encoding) # utf-8
# print(result_base.text) # 搜索榜一大哥 肖申克的救赎,查为空
 
 
# 2、对比分析F12-NETWORK-FETCH/XHR中的连接
result = requests.get(url, headers=headers)
# print(result.apparent_encoding) # utf-8
# print(result.encoding) # utf-8
#print(result.text) # 获取正常,不看了关掉
 
 
#r = json.loads() # 字符串是json、就可以用,常出现在正则表达式提取后
result_json = result.json() # 网页是json的时候,可以直接用
#print(result_json) # 成功转化成json,不看了关掉
 
movies = []
for i in result_json:
    title = i["title"]
    date = i["release_date"]
    types = i["types"]
    score = i["score"]
    actors = i["actors"]
    movie = {
        "title": title,
        "date": date,
        "type": types,
        "score": score,
        "actors": actors
    }
    # print(movie) # 获取正常,不看了关掉
    movies.append(movie)
    # break # 写循环过程,检验循环取值是否正确,第一个就断开,不看了关掉
 
print(movies)

豆瓣多页输出

import time
 
import pandas
import requests
 
# url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=0&limit=20"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',
    'Cookie': 'bid=hCw6GK7T3ko; _pk_id.100001.4cf6=e05499d4844cbfde.1697382901.; __yadk_uid=Y0K7d13OW6bvDo7Rfg4GEhEopPLKv9Vk; ll="118303"; _vwo_uuid_v2=D116B2284E0415DE6F0E8E62C0F3F1B7C|dbd80bec580d442e73cbc806b51e709a; ct=y; douban-fav-remind=1; __utmc=30149280; __utmz=30149280.1698504570.8.7.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmc=223695111; __utmz=223695111.1698504570.7.6.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; Hm_lvt_16a14f3002af32bf3a75dfe352478639=1698504600; Hm_lpvt_16a14f3002af32bf3a75dfe352478639=1698504600; ap_v=0,6.0; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1698558921%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DxUZ2pFPHLGI9UjAZ5BVOkGTqzr9mirz0hM9tSnQ4LgGBvkpYQRkEaveglj68M1Hs%26wd%3D%26eqid%3Dbd0c500a000673f800000006653d1f77%22%5D; __utma=30149280.1569954803.1697382901.1698557082.1698558922.11; __utma=223695111.1379090793.1697382901.1698557082.1698558922.10'
}
movies = []
urls = []
count = 0
#
# 获取多个动态url 4*20个
for i in range(0, 4):
    url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start={}&limit=20".format(
        i * 20) # format函数,能替代掉一整个花括号   {}
    print(url)
    urls.append(url)
 
# 多个动态url里提取各自的json
for urli in urls:  # 4次找url
    result = requests.get(urli, headers=headers)
    #print(result.text)
    result_json = result.json()
 
    time.sleep(2)  # 注意做时间间隔,减少反爬机制响应
 
    for i in result_json:  # 每次url找20个json
        title = i["title"]
        date = i["release_date"]
        types = i["types"]
        score = i["score"]
        actors = i["actors"]
        movie = {
            "title": title,
            "date": date,
            "type": types,
            "score": score,
            "actors": actors
        }
        # print(movie) # 获取正常,不看了关掉
        movies.append(movie)
        # break # 写循环过程,检验循环取值是否正确,第一个就断开,不看了关掉
    count = count + 1
    print(f"第{count}页获取成功")
 
# print(movies) # 获取正常,不看了关掉
# 整合表头和表格数据构成dataframe表格对象
df = pandas.DataFrame(movies, columns=["title", "date", "type", "score", "actors"])
# print(df)
df.to_excel('豆瓣剧情片排行榜.xlsx')

二、理论学习

在介绍如何爬取动态网页之前,我们先来了解一下什么是动态网页。动态网页指的是通过JavaScript等技术在客户端动态生成HTML代码的网页。与之相对应的是静态网页,静态网页是指在服务器端生成HTML代码并直接返回给客户端的网页。

1.抓取动态网页的技术

对于动态网页的数据可以直接使用模拟浏览器运行的方式进行实现,这样做就可以不用管网页内部是如何使用JavaScript渲染页面的,也不用管Ajax请求中到底有没有加密参数,在浏览器中看到是什么样的内容,抓取的结果便是什么样的内容。Python中提供了许多模拟浏览器运行的库,包括Selenium 、Splash、PyAutoGUI等。

  • Selenium

Selenium是一款用于Web应用程序测试的工具,也可以用来爬取动态网页。Selenium可以模拟浏览器的行为,执行其中的JavaScript代码,并获取生成的HTML文档。

  • Splash

Splash 用于JavaScript渲染服务,是一个带有HTTP API的轻量级 Web浏览器,而且对接了Twisted(事件驱动型的网络引擎)和Qt5(进行Qt C++软件开发基本框架的最新版本)。Splash 实现了以下功能。

采用异步方式并行处理多个网页渲染过程。

获取渲染后页面的源代码或截图。

通过关闭图像或使用Adblock Plus 规则加快页面渲染速度。可执行特定的JavaScript脚本。

可以通过Lua脚本控制页面的渲染过程。

以HAR ( HTTP Archive )格式呈现获取渲染的详细过程。

  • PyAutoGUI

PyAutoGUI是一个用于自动化测试的库,它可以使用Python程序控制鼠标和键盘自动与其他应用程序交互,支持 Windows .macOS和Linux 等平台。PyAutoGUI具有以下一些特点。

移动鼠标并在其他应用程序的窗口中单击或键入文本。向应用程序发送按键,比如填写表格。

截取屏幕截图并发送一张图像,在屏幕上找到它。

定位应用程序的窗口,并移动、调整大小、最大化、最小化或关闭该窗口(目前仅适用于Windows ) 。

2.Selenium和WebDriver的安装与配置

在使用Selenium抓取动态网页的数据之前,我们需要先在计算机上安装Selenium,以及与Selenium一起配合使用的浏览器驱动WebDriver。为了避免后续在网络爬虫程序中重复指定WebDriver的执行路径,我们需要为WebDriver配置环境变量。

  • Selenium的安装

Selenium的安装方式非常简单,可以直接使用pip命令安装,具体的安装命令如下。

pip install selenium==3.141.0

若命令行窗口中出现Successfully installed selenium的提示信息,说明成功安装了Selenium库。

  • WebDriber的安装

每种浏览都有一个特定的WebDriver。WebDriver称为驱动程序,通过驱动程序实现Selenium与浏览器之间的交互。

                                    

注意:不同版本的浏览器驱动程序支持的浏览器版本也不同,在下载浏览器的驱动程序之前,需要先查看当前;浏览器的版本号。

将WebDriver配置到系统环境变量后,程序中再次使用WebDriver时,就不需要重复指定WebDriver的执行路径了。

3.Selenium的基本使用

  • WebDriver类的常用属性和方法

为模仿用户真实操作浏览器的过程, webdriver模块的WebDriver类(表示浏览器)中提供了一些执行诸如打开浏览器、关闭浏览器、刷新页面、前进、后退等入门操作的方法或属性。WebDriver类的常用属性如下所示。

                             

为模仿用户真实操作浏览器的过程, webdriver模块的WebDriver类(表示浏览器)中提供了一些执行诸如打开浏览器、关闭浏览器、刷新页面、前进、后退等入门操作的方法或属性。WebDriver类的常用方法如下所示。

                                            

  • 定位元素

Selenium的 WebDriver类中提供了定位元素的方法,这些方法按照元素的数量可以分为定位单个元素和定位多个元素。WebDriver类中定位单个元素的方法如下所示。

                                          

  • 鼠标操作

常用的鼠标操作有双击、右击、拖曳、按住不动等,它们都封装为ActionChains类的方法。ActionChains类中常用的鼠标操作方法如下所示。

                        

  • 下拉列表框操作

Selenium中,Select类专门用于处理下拉框,该类提供了以下几个方法从下拉框中选择选项或取消选项。

select_by_index()∶根据索引选择下拉框中的选项,且索引是从О开始的。

select_by_value()∶根据值选择下拉框中的选项,这里的值是<option>元素中value属性的值,而不是下拉框中选项的值。

select_by_visible_text():根据文字选择下拉框中的选项,这里的文字是<option>元素的文本内容。deselect_all():取消全部选择。

  • 弹出框处理

Selenium中的Alert类用于处理这3类弹出框,不过在处理弹框之前需要先使用WebDriver类对象的switch_to.alert选中弹出框。

要想处理警告框, Selenium 的Alert类中提供了text属性和accept()方法,其中text属性用于获取警告框中的警告消息; accept()方法用于单击确定按钮。

要想处理确认框,Selenium的Alert类中提供了text属性、 accept()方法和dismiss()方法,其中text属性和accept()方法与警告框中的作用相同, dismiss)方法用于单击“取消”按钮。

要想处理提示框,Selenium的Alert类中提供了text属性、 accept()方法、 dismiss)方法和send_keys()方法,前三个属性或方法的作用与确认框中的作用相同, send_keys()方法用于接收用户输入的内容。

  • 页面切换

在浏览器中可以同时打开多个窗口,但每次只能显示一个窗口的页面。若希望显示其他窗口的页面,则需要单击窗口上方的选项卡,达到页面切换的效果。

Selenium通过窗口句柄来区分浏览器的窗口,它为每个浏览器窗口分配了唯一句柄ID,通过这个句柄ID可以切换到指定的页面。Selenium的 WebDriver类中提供了一些操作窗口句柄的属性或方法。

window_handles:获取所有窗口的句柄ID。

current_window_handle:获取当前窗口的句柄ID。

switch_to.window()∶跳转到指定窗口。

  • 页面等待

Selenium提供了两种实现页面等待的方式,分别是隐式等待和显式等待,其中隐式等待是等待特定的时间,显式等待是指定某一条件,直到这个条件成立后才继续执行。

隐式等待

隐式等待是设置一个全局最大等待时间,单位为秒( s )。隐式等待可以使用WebDriver类的implicitly_wait()方法实现,它使得 WebDriver类的对象在定位元素时,每隔一段特定的时间就会轮询一次节点树,直到元素被发现为止。

implicitly_wait(self, time_to_wait)

implicitly_wait()方法中只包含一个参数time_to_wait,该参数表示等待的时长,单位为秒数。需要注意的是,隐式等待的时间一经设置,这个设置就会在WebDriver类对象的整个生命周期起作用。

显式等待

显式等待是设定等待条件并设置最长等待时间,如果超出等待时间还没有找到元素,那么便会抛出异常,在Selenium中,webdriver.support.ui模块的WebDriverWait类用于处理显式等待。

WebDriverWait(driver, timeout, poll_frequency= POLL_FREQUENCY,ignored_exceptions=None)

driver : WebDriver的驱动程序。

timeout:最长超时时间,默认以秒为单位。

poll_frequency∶休眠的间隔时间,默认为0.5秒。

ignore_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常。

WebDriverWait类的对象通常和until()或until_not()方法配合使用,这两个方法的作用相同,都用于在指定的时间内调用WebDriver对象定位元素,直到返回值不为False为止。until() 或until_not()方法有两个参数method和message ,其中参数method表示可调用的WebDriver对象;message表示设置的异常提示信息。

三、小结

以上是小编对网络爬虫爬取动态网页数据的一些总结,希望对网络爬虫爬取动态网页数据的初学者有所帮助,有什么不足的地方,欢迎评论区留言哦,小编会虚心请教、弥补不足的,希望大家多多包容,最后祝大家学有所成,天天开心!

  • 46
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值