使用 pandas 从 HTML 脚本中将 @Type 抓取到 csv 文件中
Scraping @Type from HTML Script into a csv file using pandas
我是第一次尝试网络抓取,我遇到了很多麻烦,尤其是因为我应该使用的网站会尽力阻止抓取库。我下载了 HTML 代码,但我要收集的数据不在标签中(如 div、li、...)。它就像显示字典的@type。我需要制作一个数据集,其中包含显示字典中的列(评级值、作者、URL 和描述)。我下载的 HTML 源代码附在下面。感谢您的帮助!
这是我用来抓取它的代码:
from bs4 import BeautifulSoup
import requests
import re
import pandas as pd
from selenium import webdriver
import codecs
import os
import numpy as np
import pandas as pd
#import nltk
#import matplotlib.pyplot as plt
#from tensorflow import keras
os.system('cls')
PATH = "C:\Users\HCES\Downloads\chromedriver.exe"
driver = webdriver.Chrome(PATH)
i=1
driver.get("https://www.zomato.com/beirut/divvy-ashrafieh/reviews?page= {}&sort=dd&filter=reviews-dd".format(i))
page_source = driver.page_source
soup = BeautifulSoup(page_source,"lxml")
从 soup
中,您可以 select 具有文本
的 <script>
window.PRELOADED_STATE = .....
和
- 通过执行一些字符串操作来提取字符串(采用 JSON 格式),例如 剥离 不必要的数据
- 使用
json
模块将其转换为 JSON 格式
- 从JSON中提取你需要的数据。
在我的代码中,x
指的是上面提到的<script>
元素
import json
x = x.lstrip('window.__PRELOADED_STATE__ = JSON.parse("')
x = x.rstrip('");')
json_string = json.loads(x)
json_string
为JSON格式,可以拉取数据
import json
import re
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0'
}
def main(url, page):
params = {
'page': page,
'sort': 'dd',
'filter': 'reviews-dd'
}
r = requests.get(url, params=params, headers=headers)
match = re.search(r'\.parse\((.*)\)', r.text).group(1)
goal = json.loads(json.loads(match))
print(goal.keys())
main('https://www.zomato.com/beirut/divvy-ashrafieh/reviews', 1)
输出:
dict_keys(['pages', 'blogData', 'pageUrlMappings', 'careers', 'allJobs', 'department', 'aboutus', 'sneakpeek', 'apiState', 'entities', 'user', 'uiLogic', 'location', 'gAds', 'footer', 'langKeys', 'deviceSpecificInfo', 'pageBlockerInfo', 'fullPageAds', 'networkState', 'fetchConfigs', 'hrefLangInfo', 'pageConfig', 'partnershipLoginModal', 'partnershipLoginOptionModal', 'doesNotDeliverModal', 'backButton'])
我是第一次尝试网络抓取,我遇到了很多麻烦,尤其是因为我应该使用的网站会尽力阻止抓取库。我下载了 HTML 代码,但我要收集的数据不在标签中(如 div、li、...)。它就像显示字典的@type。我需要制作一个数据集,其中包含显示字典中的列(评级值、作者、URL 和描述)。我下载的 HTML 源代码附在下面。感谢您的帮助!
这是我用来抓取它的代码:
from bs4 import BeautifulSoup
import requests
import re
import pandas as pd
from selenium import webdriver
import codecs
import os
import numpy as np
import pandas as pd
#import nltk
#import matplotlib.pyplot as plt
#from tensorflow import keras
os.system('cls')
PATH = "C:\Users\HCES\Downloads\chromedriver.exe"
driver = webdriver.Chrome(PATH)
i=1
driver.get("https://www.zomato.com/beirut/divvy-ashrafieh/reviews?page= {}&sort=dd&filter=reviews-dd".format(i))
page_source = driver.page_source
soup = BeautifulSoup(page_source,"lxml")
从 soup
中,您可以 select 具有文本
<script>
window.PRELOADED_STATE = .....
和
- 通过执行一些字符串操作来提取字符串(采用 JSON 格式),例如 剥离 不必要的数据
- 使用
json
模块将其转换为 JSON 格式 - 从JSON中提取你需要的数据。
在我的代码中,x
指的是上面提到的<script>
元素
import json
x = x.lstrip('window.__PRELOADED_STATE__ = JSON.parse("')
x = x.rstrip('");')
json_string = json.loads(x)
json_string
为JSON格式,可以拉取数据
import json
import re
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0'
}
def main(url, page):
params = {
'page': page,
'sort': 'dd',
'filter': 'reviews-dd'
}
r = requests.get(url, params=params, headers=headers)
match = re.search(r'\.parse\((.*)\)', r.text).group(1)
goal = json.loads(json.loads(match))
print(goal.keys())
main('https://www.zomato.com/beirut/divvy-ashrafieh/reviews', 1)
输出:
dict_keys(['pages', 'blogData', 'pageUrlMappings', 'careers', 'allJobs', 'department', 'aboutus', 'sneakpeek', 'apiState', 'entities', 'user', 'uiLogic', 'location', 'gAds', 'footer', 'langKeys', 'deviceSpecificInfo', 'pageBlockerInfo', 'fullPageAds', 'networkState', 'fetchConfigs', 'hrefLangInfo', 'pageConfig', 'partnershipLoginModal', 'partnershipLoginOptionModal', 'doesNotDeliverModal', 'backButton'])