在python中以编程方式打开页面

时间:2013-11-27 12:40:31

标签: python web-scraping beautifulsoup urllib2 mechanize

您可以从此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

4 个答案:

答案 0 :(得分:7)

该页面的大部分信息都是通过Javascript加载和显示的(可能是通过Ajax调用),最有可能直接防止抓取。因此,要么你需要使用运行Javascript的浏览器,并远程控制它,或者在javascript中编写刮刀本身,或者你需要解构网站并确定它用Javascript加载的确切内容以及如何,并查看是否你可以复制这些电话。

答案 1 :(得分:5)

您可以使用浏览器自动化工具。

例如,这个简单的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编号

答案 2 :(得分:2)

您可以使用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()

答案 3 :(得分:0)

您不必使用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']