您可以从此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
答案 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']