使用python刮取预订注释

时间:2019-04-13 19:23:52

标签: web-scraping beautifulsoup urllib

我正试图从此网站获得Booking.com评论的标题:

https://www.booking.com/reviews/co/hotel/ibis-bogota-museo.es.html?page=1;r_lang=all;rows=75

其中r_lang=all基本上表示网站应以每种语言显示评论。

为了从此页面获取标题,我这样做:

from urllib.request import urlopen
from bs4 import BeautifulSoup

page = urlopen(url)
soup = BeautifulSoup(page)
reviews = soup.findAll("li", {"class": "review_item clearfix "})

for review in reviews:
    print(review.find("div", {"class": "review_item_header_content"}).text)

在网站上(请参见屏幕截图),前两个标题应为“ Sencillamente placentera”和“可能很棒”。但是,以某种方式,URL仅以西班牙语加载注释: “胎盘胎盘菌”

“ laatenciónde la chica del restaurante”

“ El desayuno estilo自助餐,完全”

“我是gusto laubicación,您是vista。”

“ Suubicaciónes muy buena”。

我注意到,如果在URL中,我会更改“ museo.es”。到“ museo.en。”,我得到了英文注释的标题。但这是不一致的,因为如果我加载原始URL,则会收到英文,法文,西班牙文等的注释。如何解决此问题?谢谢

enter image description here

2 个答案:

答案 0 :(得分:2)

可以将服务器配置为基于发出请求的浏览器发送不同的响应。添加User-Agent似乎可以解决问题。

import urllib.request
from bs4 import BeautifulSoup
url='https://www.booking.com/reviews/co/hotel/ibis-bogota-museo.es.html?page=1;r_lang=all;rows=75'
req = urllib.request.Request(
    url,
    headers={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36',
    }
)

f = urllib.request.urlopen(req)
soup = BeautifulSoup(f.read().decode('utf-8'),'html.parser')
reviews = soup.findAll("li", {"class": "review_item clearfix "})
for review in reviews:
    print(review.find("div", {"class": "review_item_header_content"}).text)

输出:

“Sencillamente placentera”


“It could had been great.”


“will never stay their in the future.”


“Hôtel bien situé.”
...

答案 1 :(得分:1)

您始终可以将浏览器用作计划B。硒不存在此问题

from selenium import webdriver

d = webdriver.Chrome()
d.get('https://www.booking.com/reviews/co/hotel/ibis-bogota-museo.es.html?page=1;r_lang=all;rows=75')
titles = [item.text for item in d.find_elements_by_css_selector('.review_item_review_header [itemprop=name]')]
print(titles)