使用 scrapy 从 table 抓取数据
Scraping data from a table using scrapy
我正在学习用于数据提取的 scrapy。我试图从网页中提取 DISPENSARY NAME
和 ADDRESS
信息 - https://arizonamedicalmarijuanaclinic.com/dispensaries/。
我发现很难提取表格格式的信息。我试过了-
scrapy shell 'https://arizonamedicalmarijuanaclinic.com/dispensaries/'
data = response.css('table').extract()
但这不会提取 table,它不会提供任何输出,我也尝试过其他组合,但 none 有效。谁能给我点提示。
table 由 JS 动态渲染,scrapy 无法访问
你应该像这样尝试Splash or Selenium. if you want you can use this api to extract the data easily using requests。
import requests
import json
url = 'https://arizonamedicalmarijuanaclinic.com/wp-admin/admin-ajax.php?action=wp_ajax_ninja_tables_public_action&table_id=42643&target_action=get-all-data&default_sorting=old_first'
import requests
headers = {
'authority': 'arizonamedicalmarijuanaclinic.com',
'pragma': 'no-cache',
'cache-control': 'no-cache',
'sec-ch-ua': '"Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"',
'accept': '*/*',
'x-requested-with': 'XMLHttpRequest',
'sec-ch-ua-mobile': '?0',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
'sec-fetch-site': 'same-origin',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://arizonamedicalmarijuanaclinic.com/dispensaries/',
'accept-language': 'en-US,en;q=0.9',
}
params = (
('action', 'wp_ajax_ninja_tables_public_action'),
('table_id', '42643'),
('target_action', 'get-all-data'),
('default_sorting', 'old_first'),
)
response = requests.get('https://arizonamedicalmarijuanaclinic.com/wp-admin/admin-ajax.php', headers=headers, params=params)
print(response.status_code)
for data in response.json():
print(data['value']['dispensaryname'])
我认为你最好使用蜘蛛而不是通过shell提取数据。
此外,必须要执行 sleep
操作,因为您必须等待视图被渲染。 Selenium
或其他 JS 驱动程序仅在您必须与 HTML 交互(更改标签、插入数据等)时有用。
因此,使用 sleep
(不推荐)或其他 scrapy 等待操作,然后使用 response.xpath(".//table") 到 select table。您可以跟随执行并创建一个for循环以逐行恢复。
我正在学习用于数据提取的 scrapy。我试图从网页中提取 DISPENSARY NAME
和 ADDRESS
信息 - https://arizonamedicalmarijuanaclinic.com/dispensaries/。
我发现很难提取表格格式的信息。我试过了-
scrapy shell 'https://arizonamedicalmarijuanaclinic.com/dispensaries/'
data = response.css('table').extract()
但这不会提取 table,它不会提供任何输出,我也尝试过其他组合,但 none 有效。谁能给我点提示。
table 由 JS 动态渲染,scrapy 无法访问
你应该像这样尝试Splash or Selenium. if you want you can use this api to extract the data easily using requests。
import requests
import json
url = 'https://arizonamedicalmarijuanaclinic.com/wp-admin/admin-ajax.php?action=wp_ajax_ninja_tables_public_action&table_id=42643&target_action=get-all-data&default_sorting=old_first'
import requests
headers = {
'authority': 'arizonamedicalmarijuanaclinic.com',
'pragma': 'no-cache',
'cache-control': 'no-cache',
'sec-ch-ua': '"Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"',
'accept': '*/*',
'x-requested-with': 'XMLHttpRequest',
'sec-ch-ua-mobile': '?0',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
'sec-fetch-site': 'same-origin',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://arizonamedicalmarijuanaclinic.com/dispensaries/',
'accept-language': 'en-US,en;q=0.9',
}
params = (
('action', 'wp_ajax_ninja_tables_public_action'),
('table_id', '42643'),
('target_action', 'get-all-data'),
('default_sorting', 'old_first'),
)
response = requests.get('https://arizonamedicalmarijuanaclinic.com/wp-admin/admin-ajax.php', headers=headers, params=params)
print(response.status_code)
for data in response.json():
print(data['value']['dispensaryname'])
我认为你最好使用蜘蛛而不是通过shell提取数据。
此外,必须要执行 sleep
操作,因为您必须等待视图被渲染。 Selenium
或其他 JS 驱动程序仅在您必须与 HTML 交互(更改标签、插入数据等)时有用。
因此,使用 sleep
(不推荐)或其他 scrapy 等待操作,然后使用 response.xpath(".//table") 到 select table。您可以跟随执行并创建一个for循环以逐行恢复。