我正在尝试获取以下网页:
import urllib
urllib.urlopen("http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1").read()
结果与我使用谷歌浏览器检查网页源代码时看到的不符。
你能告诉我为什么会发生这种情况以及如何改进我的代码来克服这个问题吗?
感谢您的帮助。
您从中得到的urlopen
是原始网页,这意味着没有执行 javascript 不使用 css;您从 Chrome(或其他浏览器)获得的是最终网页,其中包括可执行的 javascript(可能会改变 HTML)、css 渲染等。所有这些都不会发生在urlopen
...
因此差异,希望这很清楚
您可以使用 python Selenium 来解决您的问题。这是一个示例代码看看。
from selenium import webdriverr
url = "http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1"
browser = webdriver.Firefox()
browser.get(url)
sleep(10)
all_body_id_html = browser.find_element_by_id('body') # you can also get all html
然后根据您的选择完成剩下的工作,浏览器实例的更多示例
def login(user='ssdf', password="cisin123"):
content = browser.find_element_by_id('content')
content.find_element_by_xpath('.//tbody/tr[2]//input[contains(@class,"textbox")]').send_keys(user)
content.find_element_by_xpath('.//tbody/tr[3]//input[contains(@class,"textbox")]').send_keys(password)
content.find_element_by_css_selector(".button").click()
您可以将 Selenium 与 Firefox 一起使用来解决该问题,但在许多情况下它可能不适合,因为每次运行代码时都会弹出浏览器。另一个想法是使用像 PhantomJS 这样的无头浏览器。
最好的方法是使用 mechanize 库。通过 pip 安装 mechanize。
pip install mechanize
然后您可以使用以下代码:
import mechanize
mb = mechanize.Browser()
mb.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
mb.set_handle_robots(False)
url = "http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1"
response = mb.open(url).read()
print response
它还提供睡眠和执行脚本的选项。您可以在文档中阅读它们。
此外,一些网站有一个所谓的浏览器开关,这可能会导致在使用不同的浏览器时显示不同的来源(例如,显示移动浏览器的精简版本)。
看看http://www.diveintopython.net/http_web_services/user_agent.html如何将用户代理更改为“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1"(实际上是我的用户代理)。
听起来您想要一个可以像浏览器一样运行并为您运行 javascript 的库,然后为您提供生成的源代码。Windmill 应该可以为您做到这一点。( http://www.getwindmill.com/ )
有一篇关于如何将它用于你想要的东西的好文章:http:
//www.packtpub.com/article/web-scraping-with-python