我正在尝试从Tripadvisor.com网页上抓取/提取公司/酒店的网站。当我检查页面时,我没有看到网站的网址。关于如何使用python提取网站URL的任何想法? 提前道歉,因为我最近才开始“用Python进行网络抓取”。 谢谢。
E.g。请参阅图中的两个红色箭头。当我选择网站链接时,我需要“http://www.i-love-my-india.com/” - 这是我想用Python提取的内容。
答案 0 :(得分:7)
使用Selenium尝试这个:
import time
from selenium import webdriver
browser = webdriver.Firefox(executable_path="C:\\Users\\Vader\\geckodriver.exe")
# Must install geckodriver (handles your browser)- see instructions on
# http://selenium-python.readthedocs.io/installation.html.
# Change the path to where your geckodriver file is.
browser.get('https://www.tripadvisor.co.uk/Attraction_Review-g304551-d4590508-Reviews-Ashok_s_Taxi_Tours-New_Delhi_National_Capital_Territory_of_Delhi.html')
browser.find_element_by_css_selector('.blEntry.website').click()
#browser.window_handles # Results is 2 tabs opened.
browser.switch_to.window(browser.window_handles[1]) # changes the browser to
# the second one
time.sleep(1) # When I went directly I was getting a 'blank' result, so I put
# a little delay and it worked (I really do not know why).
res = browser.current_url # the URL
print(res)
browser.quit() # Closes the browser
答案 1 :(得分:4)
如果您查看该元素,您会注意到重定向URL在那里(data-ahref
属性),但它已被编码并在JS源中的某处解码。不幸的是,它们被缩小和混淆,因此找到解码器功能将很困难。因此,您有两个选择:
这是Roberval _T_在answer中建议的内容:点击元素,等待一段时间将页面加载到另一个标签中,抓取网址。这是一个非常有效的答案,在我看来值得投票,但是当我想要的数据由于某种原因不可用时,我总是尝试一些技巧:
抓取移动网页的明显优势在于它们比桌面网页更轻巧。但是,当桌面版本出于某种原因试图隐藏数据时,移动网站通常也会显示数据。在这种情况下,可以立即抓取移动版本中的所有信息(地址,主页,电话),而无需明确加载URL。以下是我使用移动用户代理运行selenium时页面的样子:
使用iPhone的用户代理的示例代码:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
url = 'https://www.tripadvisor.co.uk/Attraction_Review-g304551-d4590508-Reviews-Ashok_s_Taxi_Tours-New_Delhi_National_Capital_Territory_of_Delhi.html'
chrome_options = Options()
chrome_options.add_argument('--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1')
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get(url)
element = driver.find_element_by_css_selector('div.website.contact_link')
link = element.text
driver.quit()
print(link)
答案 2 :(得分:2)
我建议使用硒。
我的回答可以看作是@Roberval T 建议的改进。我认为他的答案非常适合这个特殊情况。
这是我的解决方案。我将指出一些差异,以及为什么我认为你应该考虑它们:
import sys
# Selenium
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
# I would use argparse for example
try:
assert len(sys.argv) == 2
url = sys.argv[1]
except AssertionError:
# Invalid arguments
sys.exit()
# Set up the driver
driver = webdriver.Chrome()
driver.get(url)
# Try to load the page a wait until it's loaded
try:
poll_frequency = 5
data_section_id = "taplc_location_detail_header_attractions_0"
data_section = WebDriverWait(driver, poll_frequency).until(EC.presence_of_element_located((By.ID, data_section_id)))
except TimeoutException:
# Could not load page
sys.exit()
# Get the third child ( relative to the data section div that we get by ID )
try:
third_child = data_section.find_elements_by_xpath("./*")[2]
except IndexError:
sys.exit()
# Get the child immediatly under that ( that's how the structure looks)
container_div = third_child.find_elements_by_xpath("./*")[0]
clickable_element = container_div.find_elements_by_xpath("./*")[3]
# Click the node
clickable_element.click()
# Switch tabs
driver.switch_to.window(driver.window_handles[1])
try:
new_page = WebDriverWait(driver, poll_frequency).until(EC.presence_of_element_located((By.TAG_NAME, "body")))
except TimeoutError:
sys.exit()
print(driver.current_url)
assert driver.current_url == "http://www.i-love-my-india.com/"
driver.quit()
首先,在我看来,您应该使用selenium's
个特定的等待机制而不是time.sleep()
。这样可以让您更好地微调刮刀,使其更加可靠。我建议你研究一下WebDriverWait
其次,我个人的偏好是避免使用class selectors
。我不是说他们错了。但经验告诉我,他们可以很容易地改变,并且经常在多个地方使用同一个班级(这就是为什么它是一个班级)。在这种特殊情况下,使用CSS class
进行选择是有效的,因为该类在一个地方使用。
如果在下一个版本中,在另一个地方使用同一个类会怎么样?
虽然遵循结构也不能保证,但改变的可能性较小。
使用Chrome
。自版本59
起,Google Chrome就有headless
选项。在我看来,使用Firefox
更容易。使用Firefox
将要求您在生产计算机上安装并运行x server
服务,并通过Firefox
将geckodriver
实例连接到该服务器。您可以使用Chrome
跳过所有这些。
我希望这有帮助!