js提取指定网站内容(Python脚本从动态网站收集数据的方法-元素为空 )

优采云 发布时间: 2021-12-25 08:16

  js提取指定网站内容(Python脚本从动态网站收集数据的方法-元素为空

)

  该元素为空。

  从动态网站中采集数据的方法

  我们已经看到,由于数据是使用JavaScript动态加载的,爬虫无法从动态的网站中抓取信息。在这种情况下,我们可以使用以下两种技术从依赖动态 JavaScript 的 网站 中抓取数据——

  对 JavaScript 进行逆向工程

  一个叫做逆向工程的过程会非常有用,它可以让我们了解网页是如何动态加载数据的。

  为此,我们需要单击指定元素的检查元素选项卡。接下来,我们将单击 NETWORK 选项卡以查找对该网页发出的所有请求,包括带有 /ajax 路径的 search.json。除了从浏览器或通过 NETWORK 选项卡访问 AJAX 数据之外,我们还可以在以下 Python 脚本的帮助下进行 -

  import requests

url=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 requests

import string

PAGE_SIZE = 15

url = '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)))

  运行上述脚本后,我们将得到以下输出,并且记录将保存在一个名为 countrys.txt 的文件中。

  输出

  Searching with a

adding 15 records from the page 0

adding 15 records from the page 1

...

  呈现 JavaScript

  在上一节中,我们对网页进行了逆向工程,以了解 API 的工作原理以及如何使用它在单个请求中检索结果。但是,在执行逆向工程时,我们将面临以下困难 -

  上述问题的解决方案是使用浏览器渲染引擎解析HTML,应用CSS格式,执行JavaScript来显示网页。

  例子

  在这个例子中,为了呈现 Java 脚本,我们将使用熟悉的 Python 模块 Selenium。以下 Python 代码将在 Selenium 的帮助下呈现网页 -

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

  from selenium import webdriver

  现在,提供我们根据需要下载的 Web 驱动程序的路径-

  path = r'C:\\Users\\gaurav\\Desktop\\Chromedriver'

driver = webdriver.Chrome(executable_path = path)

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

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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线