【发布时间】:2018-03-03 01:11:03
【问题描述】:
刚开始用 python 抓取网页,我遇到了一些问题。
我开始使用 Selenium 下载网页的源代码并保存:
from selenium import webdriver
driver= webdriver.Firefox()
driver.get("https://www.website.com")
f=open('output.txt','w')
f.write(driver.page_source.encode('utf-8'))
f.close()
driver.quit()
一切正常,但是 Selenium 太费时间了,所以我首先转向机械化,以获取页面源:
import mechanize
browser = mechanize.Browser()
browser.set_handle_robots(False)
cookies = mechanize.CookieJar()
browser.set_cookiejar(cookies)
browser.addheaders = [('User-agent', 'Mozilla/5.0')]
browser.set_handle_refresh(False)
browser.open("https://www.website.com")
问题来了:如果我尝试通过它的 id 查找特定的 div,它不会返回任何内容:
from bs4 import BeautifulSoup as BS
soup= BS(browser.response().read(),'lxml')
print(soup.find(id="div_id"))
虽然如果我使用常规文本编辑器检查使用 mechanize 获得的源代码,我可以找到它。是这样的:
<div id="div_id" data referrer="div_id">
这个 div 有许多其他子元素,它位于代码的 1/5 左右,完整的源代码大约 500kb。如果我尝试寻找附近的其他 div,也没有运气。然而,如果我在源代码开头附近寻找一些 div,它会找到它。更有趣的是,如果我尝试在使用 Selenium 获得的源代码中寻找相同的 div(使用 BS),而不是获得的那个使用 Mechanize,它能够找到它,尽管使用文本编辑器检查 div 看起来完全一样。
我尝试了所有支持 BS 的解析器,但没有成功。所以我认为这可能与BS有关,我尝试对lxml做同样的事情:
from lxml import etree
parser= etree.HTMLParser()
tree= etree.parse(open('source.txt'),parser)
results= tree.xpath('//div[@id="div_id"]')
print(etree.tostring(results[0]))
与 BS 一样,它能够在使用 Selenium 获得的源代码中找到 div,但无法使用 Mechanize。所以我觉得可能跟 Mechanize 有关系,转而使用 Requests:
import requests
from fake_useragent import UserAgent
ua=UserAgent()
url= 'https://www.website.com'
headers= {'User-agent': str(ua.chrome)}
page = requests.get(url, headers=headers)
当使用 BS 或 lxml 查看 div 的 page.content 时,再次失败。无论我是直接分析响应还是将其保存到文件中然后分析文件,都会发生这种情况。
我认为就是这样......我还尝试对 Mechanize 和 Requests 响应进行编码,因为我看到我已经使用 Selenium 完成了它,但没有任何变化。我也试过用其他BS版本(3.x),没有变化。
总结一下: - 如果我在通过 Selenium 获得的源代码中查找带有 BS 或 lxml 的 div,它会找到它。与其他的,没有。 - 如果我在源代码开头寻找其他div,BS和lxml找到它,与用于获取代码的方法无关。 - 经检查,div 在任何情况下都存在。
使用的版本: -蟒蛇:2.7.9 -BeautifulSoup:4.6.0 -机械化:0.3.5 -请求:2.18.4 -硒:3.5.0 -lxml:4.0.0 -操作系统:linux debian
谢谢。
【问题讨论】:
-
如果你给我们实际的 URL 会有所帮助。
-
url: facebook.com/groups/1584160618524185 div id: pagelet_forsale_island 谢谢
标签: python web-scraping beautifulsoup lxml mechanize