Airbnb 房东主页评论爬取
经常会出现一个报错:
Selenium弹出新页面无法定位元素问题(Unable to locate element)
可以用如下方法:
wait = ui.WebDriverWait(browser,10)
wait.until(lambda browser: browser.find_element_by_方法(''))
WebDriverWait(browser,10):10秒内每隔500毫秒扫描1次页面变化,当出现指定的元素后结束。当然可以使用静态的方法sleep,我之前睡五秒,但有的时候网速不稳定,所以可能还是定位不到,使用这种动态的方法,会比较稳妥。
从代码可读性上和效率上都是A方法比较好,更加符合python的特性。
完整代码如下:
from selenium import webdriver
import selenium.webdriver.support.ui as ui
import time
fp = open('test3.csv','w',encoding='utf_8_sig')
writer = csv.writer(fp,delimiter=' ')
browser = webdriver.Firefox()
wait = ui.WebDriverWait(browser,10)
browser.get('https://www.airbnb.cn/users/show/237746032')
for j in range(1,10):
wait.until(lambda browser: browser.find_element_by_xpath('/html/body/div[3]/main/div/div/div/div/div/div[2]/div/div[4]/section/div/div[{}2]/div[2]/button'.format(j)))
elem_btn = browser.find_element_by_xpath('/html/body/div[3]/main/div/div/div/div/div/div[2]/div/div[4]/section/div/div[{}2]/div[2]/button'.format(j)) #定位搜索按钮
elem_btn.click()
for i in range(2,50):
wait.until(lambda browser: browser.find_element_by_xpath('/html/body/div[3]/main/div/div/div/div/div/div[2]/div/div[4]/section/div/div[{}]/div[1]/div/div[2]/div/div'.format(i)))
review = browser.find_element_by_xpath('/html/body/div[3]/main/div/div/div/div/div/div[2]/div/div[4]/section/div/div[{}]/div[1]/div/div[2]/div/div'.format(i)).text
#print(des)
writer.writerow((review))
fp.close()
部分代码解释
for j in range(1,10):
wait.until(lambda browser: browser.find_element_by_xpath('/html/body/div[3]/main/div/div/div/div/div/div[2]/div/div[4]/section/div/div[{}2]/div[2]/button'.format(j)))
elem_btn = browser.find_element_by_xpath('/html/body/div[3]/main/div/div/div/div/div/div[2]/div/div[4]/section/div/div[{}2]/div[2]/button'.format(j)) #定位搜索按钮
elem_btn.click()
这段代码是循环点击“显示更多评价”,定位的规律是倒数第二个div累加10,从而将所有评价加载出来,循环次数可以根据评论数量来设置。
打印评论,循环参数根据评论数量决定,定位的规律是倒数第六个div累加1。
for i in range(2,50):
wait.until(lambda browser: browser.find_element_by_xpath('/html/body/div[3]/main/div/div/div/div/div/div[2]/div/div[4]/section/div/div[{}]/div[1]/div/div[2]/div/div'.format(i)))
review = browser.find_element_by_xpath('/html/body/div[3]/main/div/div/div/div/div/div[2]/div/div[4]/section/div/div[{}]/div[1]/div/div[2]/div/div'.format(i)).text
print(review)