赞
踩
目录
- 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代码并直接返回给客户端的网页。
对于动态网页的数据可以直接使用模拟浏览器运行的方式进行实现,这样做就可以不用管网页内部是如何使用JavaScript渲染页面的,也不用管Ajax请求中到底有没有加密参数,在浏览器中看到是什么样的内容,抓取的结果便是什么样的内容。Python中提供了许多模拟浏览器运行的库,包括Selenium 、Splash、PyAutoGUI等。
Selenium是一款用于Web应用程序测试的工具,也可以用来爬取动态网页。Selenium可以模拟浏览器的行为,执行其中的JavaScript代码,并获取生成的HTML文档。
Splash 用于JavaScript渲染服务,是一个带有HTTP API的轻量级 Web浏览器,而且对接了Twisted(事件驱动型的网络引擎)和Qt5(进行Qt C++软件开发基本框架的最新版本)。Splash 实现了以下功能。
采用异步方式并行处理多个网页渲染过程。
获取渲染后页面的源代码或截图。
通过关闭图像或使用Adblock Plus 规则加快页面渲染速度。可执行特定的JavaScript脚本。
可以通过Lua脚本控制页面的渲染过程。
以HAR ( HTTP Archive )格式呈现获取渲染的详细过程。
PyAutoGUI是一个用于自动化测试的库,它可以使用Python程序控制鼠标和键盘自动与其他应用程序交互,支持 Windows .macOS和Linux 等平台。PyAutoGUI具有以下一些特点。
移动鼠标并在其他应用程序的窗口中单击或键入文本。向应用程序发送按键,比如填写表格。
截取屏幕截图并发送一张图像,在屏幕上找到它。
定位应用程序的窗口,并移动、调整大小、最大化、最小化或关闭该窗口(目前仅适用于Windows ) 。
在使用Selenium抓取动态网页的数据之前,我们需要先在计算机上安装Selenium,以及与Selenium一起配合使用的浏览器驱动WebDriver。为了避免后续在网络爬虫程序中重复指定WebDriver的执行路径,我们需要为WebDriver配置环境变量。
Selenium的安装方式非常简单,可以直接使用pip命令安装,具体的安装命令如下。
pip install selenium==3.141.0
若命令行窗口中出现Successfully installed selenium的提示信息,说明成功安装了Selenium库。
每种浏览都有一个特定的WebDriver。WebDriver称为驱动程序,通过驱动程序实现Selenium与浏览器之间的交互。
注意:不同版本的浏览器驱动程序支持的浏览器版本也不同,在下载浏览器的驱动程序之前,需要先查看当前;浏览器的版本号。
将WebDriver配置到系统环境变量后,程序中再次使用WebDriver时,就不需要重复指定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表示设置的异常提示信息。
以上是小编对网络爬虫爬取动态网页数据的一些总结,希望对网络爬虫爬取动态网页数据的初学者有所帮助,有什么不足的地方,欢迎评论区留言哦,小编会虚心请教、弥补不足的,希望大家多多包容,最后祝大家学有所成,天天开心!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。