编程下载不会出现在网页的源文本(Programmatically download text tha

2019-10-21 23:05发布

我用Python写一个爬虫。 给定一个网页,我提取它的Html以下方式内容:

import urllib2
response = urllib2.urlopen('http://www.example.com/')
html = response.read()

但一些文本组件不会出现在HTML页面的源代码,例如在本页面 (重定向到索引,请访问日期,并查看特定邮件)如果您查看网页的源文件,你会看到邮件正文没有按“T出现在源,但似乎被JS加载。

我如何编程下载这个文本?

Answer 1:

这里最简单的办法是做一个POST请求,负责电子邮件搜索URL,并解析JSON结果(提@recursive因为他第一次提出这个想法)。 例如使用requests包:

import requests

data = {
    'year': '1999',
    'month': '05',
    'day': '20',
    'locale': 'en-us'
}
response = requests.post('http://jebbushemails.com/api/email.py', data=data)

results = response.json()
for email in results['emails']:
    print email['dateCentral'], email['subject']

打印:

1999-05-20T00:48:23-05:00 Re: FW: The Reason Study of Rail Transportation in Hillsborough
1999-05-20T04:07:26-05:00 Escambia County School Board
1999-05-20T06:29:23-05:00 RE: Escambia County School Board
...
1999-05-20T22:56:16-05:00 RE: School Board
1999-05-20T22:56:19-05:00 RE: Emergency Supplemental just passed 64-36
1999-05-20T22:59:32-05:00 RE:
1999-05-20T22:59:33-05:00 RE: (no subject)

这里的一个不同的方法是让一个真正的浏览器手柄的帮助下页面加载的动态JavaScript部分selenium浏览器自动化框架:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Chrome()  # can also be, for example, webdriver.Firefox()
driver.get('http://jebbushemails.com/email/search')

# click 1999-2000
button = driver.find_element_by_xpath('//button[contains(., "1999 – 2000")]')
button.click()

# click 20
cell = driver.find_element_by_xpath('//table[@role="grid"]//span[. = "20"]')
cell.click()

# click Submit
submit = driver.find_element_by_xpath('//button[span[1]/text() = "Submit"]')
submit.click()

# wait for result to appear
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//tr[@analytics-event]")))

# get the results
for row in driver.find_elements_by_xpath('//tr[@analytics-event]'):
    date, subject = row.find_elements_by_tag_name('td')
    print date.text, subject.text

打印:

6:24:27am Fw: Support Coordination
6:26:18am Last nights meeting
6:52:16am RE: Support Coordination
7:09:54am St. Pete Times article
8:05:35am semis on the interstate
...
6:07:25pm Re: Appointment
6:18:07pm Re: Mayor Hood
8:13:05pm Re: Support Coordination

请注意,这里的浏览器也可以是无头的 ,像PhantomJS 。 而且,如果没有显示的浏览器工作在-你可以启动一个虚拟的一个示例,请参阅这里:

  • 如何在运行的Xvfb硒?
  • 与下载功能无头的浏览器测试?


Answer 2:

您可以对实际的AJAX服务的请求,而不是试图使用Web界面。

例如,一个交请求http://jebbushemails.com/api/email.py与这种形式的数据将产生的80KB容易语法分析JSON。

year:1999
month:05
day:20
locale:en-us


Answer 3:

我不是一个Python的专家,但任何功能,如只的urlopen让你的静态HTML,不执行它。 你需要的是某种形式的浏览器引擎实际上解析和执行JavaScript。 这似乎在这里得到解答:

如何解析Java的脚本包含[动态]的网页使用[HTML] Python的?



文章来源: Programmatically download text that doesn't appear in the page source