python - 使用 beautifulsoup 抓取数据
问题描述
我正在尝试从 yelp 中抓取数据,特别是纳什维尔餐厅的名称、地址、价格和评级。我正在使用美丽的汤。我有两个循环来收集数据。第二个循环正在工作,但第一个循环只适用于少数几个。我认为这与班级有关。我已经尝试了我能想到的每一个班级组合,但我仍然无法让它发挥作用。
这是我从 https://www.yelp.com/search?find_desc=Restaurants&find_loc=Nashville%2C+TN抓取的地方
当我打印每个列表时,这些是这些结果(如果找不到任何东西,它会添加“无”):第一行是公司名称,第二行:评级,第三:价格,第四行:地址
解决方案
我注意到数据是由 javascript 提取的,所以我使用这个返回 json 的调用来获取数据。
它更快更清洁。
import requests , os , csv
from urllib.parse import urljoin
def SaveAsCsv(list_of_rows):
try:
with open('data.csv', mode='a', newline='', encoding='utf-8') as outfile:
csv.writer(outfile).writerow(list_of_rows)
except PermissionError:
print("Please make sure data.csv is closed\n")
def Search():
payload = {
'find_desc': 'Restaurants',
'find_loc': 'Nashville, TN',
'start': 30, #if you want second page set start to 60 and so on
'parent_request_id': 'f3d6966567be99d1',
'request_origin': 'user'}
res = requests.get(url, params=payload)
if res.status_code == 200:
return res.json()
def Extract():
try:
JsonObj = Search()
Data = JsonObj['searchPageProps']['searchResultsProps']['searchResults']
if Data is not None:
for index , item in enumerate(Data,1):
print('getting item {} out of {}'.format(index,len(Data)))
if item.get('searchResultBusiness','') :
name = item['searchResultBusiness']['name']
rating = item['searchResultBusiness']['rating']
price = item['searchResultBusiness']['priceRange']
rank = item['searchResultBusiness']['ranking']
review = item['searchResultBusiness']['reviewCount']
phone = item['searchResultBusiness']['phone']
busUrl = urljoin(url ,item['searchResultBusiness']['businessUrl'])
SaveAsCsv([name,rating,price,rank,review,phone,busUrl])
except Exception as e:
print(e)
url = 'https://www.yelp.com/search/snippet'
if os.path.isfile('data.csv') and os.access('data.csv', os.R_OK):
print("File data.csv Already exists \n")
else:
SaveAsCsv([ 'name','rating','priceRange','ranking','reviewCount','phone','businessUrl'])
Extract()
推荐阅读
- python - 运行bash命令后如何将shell输出输入python
- python - DLL 加载失败:找不到指定的模块 PYTHON
- javascript - 承诺 {
} 使用异步等待 - c - 通过多个函数访问数组
- android - 我的自定义广播接收器不接收意图
- html - 当我在特定表格上滚动时,有什么方法可以找出我在哪个表格上?
- matlab - 在 N 个点上计算面积
- python - 如何使用父类装饰器实现实例相关功能?
- r - LaTeX 错误:pdfOutput 的 Rmarkdown 中包 xcolor 的选项冲突
- python - 无时间获取 MM-DD-YYYY 格式的文件修改日期