我正在尝试从rightmove.co.uk获取所有价格,作为一项学习练习,以便更好地了解网络抓取。
这是我的代码:
class RightmoveScraper:
def fetch(self, url):
response = requests.get(url)
print('Status code : %s' % response.status_code)
return response
def parse(self, response):
soup = BeautifulSoup(response, 'lxml')
prices = [price.text for price in soup.find_all(
'div', {'class': 'propertyCard-priceValue'})]
print(prices)
def run(self):
response = self.fetch(
'https://www.rightmove.co.uk/overseas-property-for-sale/Paris.html')
self.parse(response.text)
运行刮板时,这是打印出来的内容:
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
而不是获取价格。
有人可以指导我解决我做错的事情并给我解决方法吗?
答案 0 :(得分:1)
在抓取网站时,切勿依赖浏览器告诉您的内容(至少在HTML元素方面)。浏览器运行可填充HTML元素的JS脚本。
如果仅在文件中打印response.text
,然后快速浏览一下。您会看到<div class="propertyCard-priceValue">
标签确实是空的。背后的原因可能是价格是在加载时从JS脚本填充的。
不幸的是,解决此类问题的唯一方法是使用python代码运行浏览器。建议您看看selenium
的工作原理。
答案 1 :(得分:0)
您要查找的信息位于网页的源代码中。
但是,它作为javascript数据结构存储在路径/html/body/script[1]
下
您要做的就是阅读脚本的内容(这只是一个JSON),将JSON加载到python dict中。
有关数据,请参见https://pastebin.com/rzG9YL0y。
以下工作代码:
import json
import pprint
import requests
r = requests.get('https://www.rightmove.co.uk/overseas-property-for-sale/Paris.html')
if r.status_code == 200:
search_term = '<script>window.jsonModel = '
body = r.content.decode('utf-8')
left_idx = body.find(search_term)
right_idx = body.find('</script>', left_idx)
offset = len(search_term)
data_str = body[left_idx + offset:right_idx]
# data holds the 'data model' of the page. the prices are there as well
data = json.loads(data_str)
props = data['properties']
for entry in props:
_id = entry['id']
price = entry['price']['amount']
print('{} --> {}'.format(_id, price))
输出
81919186 --> 899000
94229627 --> 1930000
94115438 --> 5300000
94115432 --> 1490000
91433144 --> 840000
90987107 --> 758000
90987110 --> 935000
90987101 --> 1630000
90987104 --> 3064000
90987092 --> 1274500
90987098 --> 1981000
90834383 --> 3344000
90834386 --> 1140000
90834392 --> 431000
90834368 --> 630000
90666347 --> 452000
88743806 --> 5194000
90665516 --> 6250000
90665774 --> 1795000
73687471 --> 1890000
90665348 --> 10500000
69017641 --> 930000
69017644 --> 930000
90665852 --> 1790000