【问题标题】:Open a page programmatically in python在 python 中以编程方式打开页面
【发布时间】:2013-12-13 02:44:17
【问题描述】:

您能从这个webpage 中提取 VIN 号码吗?

我尝试了urllib2.build_opener、请求和机械化。我也提供了用户代理,但他们都看不到 VIN。

opener = urllib2.build_opener()
opener.addheaders = [('User-agent',('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) ' 'AppleWebKit/535.1 (KHTML, like Gecko) ' 'Chrome/13.0.782.13 Safari/535.1'))]
page = opener.open(link)
soup = BeautifulSoup(page)

table = soup.find('dd', attrs = {'class': 'tip_vehicleStats'})
vin = table.contents[0]
print vin

【问题讨论】:

  • 你得到了什么?整个页面?
  • 我得到了一个空的跨度类,但实际上应该有 VIN 号。在浏览器中检查元素时可以看到它。
  • @TeodorScorpan 它是使用 Javascript 动态创建的。
  • 你是说我没办法废掉它?
  • 测试某些内容是否正常可抓取的好方法是在关闭 JavaScript 的情况下在浏览器中查看它。

标签: python web-scraping beautifulsoup urllib2 mechanize


【解决方案1】:

该页面有很多使用 Javascript 加载和显示的信息(可能通过 Ajax 调用),很可能是为了防止抓取。因此,要抓取它,您要么需要使用运行 Javascript 的浏览器并远程控制它,要么用 javascript 编写抓取器本身,或者您需要解构站点并准确确定它使用 Javascript 加载的内容以及如何加载,并查看是否您可以复制这些调用。

【讨论】:

  • 非常感谢 Lennart Regebro。听起来很难实施。 =)
  • @TeodorScorpan 好吧,我肯定不想在 Javascript 中实现爬虫。 :-) 但是,如果您调试 javascript,则实际调用可能是简单的 Ajax 调用。我认为这是你最好的选择。
  • 你有任何例子或教程来展示如何“解构网站并..复制这些调用......”我已经有一段时间了,但从未看到任何现实生活中的成功。
  • @B.Mr.W.不,您只需要在网站上调试 Javascript 并查看正在执行的 Ajax 调用,看看是否可以复制这些。
【解决方案2】:

您可以为此目的使用浏览器自动化工具。

例如,这个简单的 selenium 脚本可以完成您的工作。

from selenium import webdriver
from bs4 import BeautifulSoup

link = "https://www.iaai.com/Vehicles/VehicleDetails.aspx?auctionID=14712591&itemID=15775059&RowNumber=0"
browser = webdriver.Firefox()
browser.get(link)
page = browser.page_source

soup = BeautifulSoup(page)

table = soup.find('dd', attrs = {'class': 'tip_vehicleStats'})
vin = table.contents.span.contents[0]
print vin

顺便说一句,table.contents[0] 打印整个跨度,包括跨度标签。

table.contents.span.contents[0] 仅打印 VIN 号。

【讨论】:

    【解决方案3】:

    您可以使用调用浏览器的 selenium。这对我有用:

    from selenium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    from selenium.webdriver.common.keys import Keys
    import time
    
    # See: http://stackoverflow.com/questions/20242794/open-a-page-programatically-in-python
    browser = webdriver.Firefox() # Get local session of firefox
    browser.get("https://www.iaai.com/Vehicles/VehicleDetails.aspx?auctionID=14712591&itemID=15775059&RowNumber=0") # Load page
    
    
    time.sleep(0.5) # Let the page load
    
    
    # Search for a tag "span" with an attribute "id" which contains "ctl00_ContentPlaceHolder1_VINc_VINLabel"
    e=browser.find_element_by_xpath("//span[contains(@id,'ctl00_ContentPlaceHolder1_VINc_VINLabel')]")
    e.text
    # Works for me : u'4JGBF7BE9BA648275'
    
    browser.close()
    

    【讨论】:

    • 我和 shshank 同时发布了这个。基本上,这是相同的想法:使用 selenium。
    【解决方案4】:

    您不必使用 Selenium。 只需提出额外的获取请求:

    import requests
    
    stock_number = '123456789'        # located at VEHICLE INFORMATION  
    url = 'https://www.clearvin.com/ads/iaai/check?stockNumber={}&vin='.format(stock_number)
    vin = requests.get(url).json()['car']['vin']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-30
      • 2016-12-17
      • 2021-07-12
      • 2014-05-10
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多