开发手册 欢迎您!
软件开发者资料库

Python Web Scraping - 动态网站

Python Web Scraping动态网站 - 从简单和简单的步骤学习Python Web Scraping,从基本到高级概念,包括简介,Python入门,用于Web抓取的Python模块,Web抓取的合法性,数据提取,数据处理,处理图像和视频,处理文本,刮动态网站,基于刮痧表格的网站,处理CAPTCHA,使用刮板进行测试。

在本章中,让我们学习如何在动态网站上执行网页抓取以及详细介绍的概念.

简介

网页抓取这是一项复杂的任务,如果网站是动态的,复杂性就会增加.根据联合国网络无障碍全球审计,超过70%的网站是动态的,它们依赖于JavaScript的功能.

动态网站示例

让我们看一个动态网站的例子,并了解为什么难以刮掉.在这里,我们将以一个名为 http://example.webscraping.com/places的网站为例进行搜索./default/search.但我们怎么能说这个网站具有动态性?可以从以下Python脚本的输出判断,它将尝试从上述网页中删除数据 :

import reimport urllib.requestresponse = urllib.request.urlopen('http://example.webscraping.com/places/default/search')html = response.read()text = html.decode()re.findall('(.*?)',text)

输出

  []

以上输出显示示例刮刀无法提取信息,因为< div>我们试图找到的元素是空的.

从动态网站刮取数据的方法

我们已经看到刮刀无法从中获取信息动态网站,因为数据是用JavaScript动态加载的.在这种情况下,我们可以使用以下两种方法从动态JavaScript依赖网站中删除数据 :

  • 逆向工程JavaScript

  • 渲染JavaScript

逆向工程JavaScript

称为逆向工程的过程将是有用,让我们了解网页如何动态加载数据.

为此,我们需要点击指定网址的检查元素标签.接下来,我们将点击 NETWORK 标签,查找为该网页发出的所有请求,包括search.json,路径为/ajax .我们不是通过浏览器或通过NETWORK选项卡访问AJAX数据,而是通过以下Python脚本的帮助来减少;

import requestsurl=requests.get('http://example.webscraping.com/ajax/search.json?page=0&page_size=10&search_term=a')url.json()

示例

上述脚本允许我们使用Python json方法访问JSON响应.类似地,我们可以下载原始字符串响应,并使用python的json.loads方法,我们也可以加载它.我们是在以下Python脚本的帮助下完成的.通过搜索字母'a'的字母,然后迭代JSON响应的结果页面,它将基本上刮掉所有国家.

import requestsimport stringPAGE_SIZE = 15url = 'http://example.webscraping.com/ajax/' + 'search.json?page={}&page_size={}&search_term=a'countries = set()for letter in string.ascii_lowercase:   print('Searching with %s' % letter)   page = 0   while True:   response = requests.get(url.format(page, PAGE_SIZE, letter))   data = response.json()   print('adding %d records from the page %d' %(len(data.get('records')),page))   for record in data.get('records'):countries.add(record['country'])   page += 1   if page >= data['num_pages']:      break   with open('countries.txt', 'w') as countries_file:   countries_file.write('n'.join(sorted(countries)))

运行上面的脚本后,我们将获得以下输出,并将记录保存在名为countries.txt的文件中.

输出

Searching with aadding 15 records from the page 0adding 15 records from the page 1...

渲染JavaScript

在上一节中,我们在网页上进行了逆向工程,了解API的工作原理以及我们如何使用它在单个请求中检索结果.但是,我们在进行逆向工程和减去时可能会面临以下困难;

  • 有时网站可能非常困难.例如,如果网站是使用Google Web Toolkit(GWT)等高级浏览器工具制作的,那么生成的JS代码将由机器生成,难以理解和逆向工程.

  • 某些更高级别的框架,例如 React.js ,可以通过抽象已经很复杂的JavaScript逻辑来使逆向工程变得困难.

上述困难的解决方案是使用浏览器呈现引擎来解析HTML,应用CSS格式并执行JavaScript来显示网页.

示例

在这个例子中,为了渲染Java Script,我们将使用熟悉的Python模块Selenium.以下Python代码将在Selenium : 的帮助下呈现网页;

首先,我们需要从selenium导入webdriver,如下所示;

from selenium import webdriver

现在,提供我们根据我们的要求下载的网络驱动程序的路径 :  ;

path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'driver = webdriver.Chrome(executable_path = path)

现在,提供我们想要在现在由我们的Python控制的Web浏览器中打开的URL脚本.

driver.get('http://example.webscraping.com/search')

现在,我们可以使用搜索工具箱的ID将元素设置为选择.

driver.find_element_by_id('search_term').send_keys('.')

接下来,我们可以使用java脚本来设置选择框内容如下 :

js ="document.getElementById('page_size').options [1] .text ='100' ;" driver.execute_script(js)

以下代码行显示已准备好在网页上点击搜索 :

driver.find_element_by_id('search').click()

下一行代码显示它将等待45秒以完成AJAX请求.

driver.implicitly_wait(45)

现在,为了选择国家/地区链接,我们可以使用CSS选择器如下 :

links = driver.find_elements_by_css_selector('#results a')

现在可以提取每个链接的文本以创建国家/地区列表 :

countries = [link.text for link in links]print(countries)driver.close()