当前位置:   article > 正文

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

爬虫抓取动态网页数据

目录

一、导学与指南

豆瓣单页分析

豆瓣多页输出

二、理论学习

1.抓取动态网页的技术

2.Selenium和WebDriver的安装与配置

3.Selenium的基本使用

三、小结


一、导学与指南

豆瓣单页分析

  1. import json
  2. import requests
  3. # 基础URL 不顶事了
  4. url_base="https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action="
  5. #经过分析的 动态内容url 才是我们要的结果
  6. url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=20&limit=20"
  7. headers = {
  8.    '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',
  9.    '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'
  10. }
  11. # # 1、查看url_base返回结果
  12. # result_base = requests.get(url_base, headers=headers)
  13. # # print(result_base.apparent_encoding) # utf-8
  14. # # print(result_base.encoding) # utf-8
  15. # print(result_base.text) # 搜索榜一大哥 肖申克的救赎,查为空
  16. # 2、对比分析F12-NETWORK-FETCH/XHR中的连接
  17. result = requests.get(url, headers=headers)
  18. # print(result.apparent_encoding) # utf-8
  19. # print(result.encoding) # utf-8
  20. #print(result.text) # 获取正常,不看了关掉
  21. #r = json.loads() # 字符串是json、就可以用,常出现在正则表达式提取后
  22. result_json = result.json() # 网页是json的时候,可以直接用
  23. #print(result_json) # 成功转化成json,不看了关掉
  24. movies = []
  25. for i in result_json:
  26.    title = i["title"]
  27.    date = i["release_date"]
  28.    types = i["types"]
  29.    score = i["score"]
  30.    actors = i["actors"]
  31.    movie = {
  32.        "title": title,
  33.        "date": date,
  34.        "type": types,
  35.        "score": score,
  36.        "actors": actors
  37.    }
  38.    # print(movie) # 获取正常,不看了关掉
  39.    movies.append(movie)
  40.    # break # 写循环过程,检验循环取值是否正确,第一个就断开,不看了关掉
  41. print(movies)

豆瓣多页输出

  1. import time
  2. import pandas
  3. import requests
  4. # url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=0&limit=20"
  5. headers = {
  6.    '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',
  7.    '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'
  8. }
  9. movies = []
  10. urls = []
  11. count = 0
  12. #
  13. # 获取多个动态url 4*20个
  14. for i in range(0, 4):
  15.    url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start={}&limit=20".format(
  16.        i * 20) # format函数,能替代掉一整个花括号   {}
  17.    print(url)
  18.    urls.append(url)
  19. # 多个动态url里提取各自的json
  20. for urli in urls:  # 4次找url
  21.    result = requests.get(urli, headers=headers)
  22.    #print(result.text)
  23.    result_json = result.json()
  24.    time.sleep(2)  # 注意做时间间隔,减少反爬机制响应
  25.    for i in result_json:  # 每次url找20个json
  26.        title = i["title"]
  27.        date = i["release_date"]
  28.        types = i["types"]
  29.        score = i["score"]
  30.        actors = i["actors"]
  31.        movie = {
  32.            "title": title,
  33.            "date": date,
  34.            "type": types,
  35.            "score": score,
  36.            "actors": actors
  37.        }
  38.        # print(movie) # 获取正常,不看了关掉
  39.        movies.append(movie)
  40.        # break # 写循环过程,检验循环取值是否正确,第一个就断开,不看了关掉
  41.    count = count + 1
  42.    print(f"第{count}页获取成功")
  43. # print(movies) # 获取正常,不看了关掉
  44. # 整合表头和表格数据构成dataframe表格对象
  45. df = pandas.DataFrame(movies, columns=["title", "date", "type", "score", "actors"])
  46. # print(df)
  47. 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表示设置的异常提示信息。

三、小结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/399072
推荐阅读
相关标签
  

闽ICP备14008679号