爬蟲網站:http://www.foodchina.com.tw/model/marketing/AnaChartNew.aspx?id=51&ChkID=297&Page=0&Type=1&cn=False
該網站需要先利用篩選器選擇你要的資料,
(類別:全選,價格:全選,區間:日,2018年1月31日前31天走勢圖)
程式碼執行後會導到
這個畫面,
我想爬蟲
http://www.foodchina.com.tw/model/ajax/getChartData.ashx
內的
type -> data -> datasets -> label -> 價格-地方
type -> data -> datasets -> label -> data -> y -> 價錢
這兩個值,
不知道是不是我data設定錯誤
目前程式碼:
from selenium import webdriver
from selenium.webdriver.support.ui import Select
import requests
from bs4 import BeautifulSoup
import pandas as pd
#安裝chromedriver,chromedriver存放位置
dr = webdriver.Chrome('C:/Users/User/chromedriver')
#造訪網頁連結
dr.get('http://www.foodchina.com.tw/model/marketing/AnaChartNew.aspx?id=51&ChkID=297&Page=0&Type=1&cn=False')
#點選所有類別checkbox
checkboxs = dr.find_elements_by_css_selector('input[type=checkbox]')
for checkbox in checkboxs:
checkbox.click()
#點選項目checkbox
checkboxs_price = dr.find_elements_by_css_selector('input[checked=checked]')
for checkbox_price in checkboxs_price:
checkbox_price.click()
#點選指定radiobutton,區間,日
radios = dr.find_elements_by_css_selector('input[value=RB1]')
for radio in radios:
radio.click()
#抓取下拉式選單元件
#年
select_year = Select(dr.find_element_by_id('ctl00_ctl00_cpl_MainContent_cpl_BasicMainContent_ddl_Year1'))
select_year.select_by_value('2018')
#月
select_month = Select(dr.find_element_by_id('ctl00_ctl00_cpl_MainContent_cpl_BasicMainContent_ddl_Month1'))
select_month.select_by_value('1')
#日
select_day = Select(dr.find_element_by_id('ctl00_ctl00_cpl_MainContent_cpl_BasicMainContent_ddl_Day'))
select_day.select_by_value('31')
#點選查詢button
buttons = dr.find_elements_by_css_selector('input[value=查詢]')
for button in buttons:
button.click()
time.sleep(10)
print("測試爬canvas圖")
print("-----------------------------------------------------------------------------------------")
# type -> data -> datasets -> label -> 價格-地方
# type -> data -> datasets -> label -> data -> y -> 價錢
url = 'http://www.foodchina.com.tw/model/ajax/getChartData.ashx'
data = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7,la;q=0.6',
'Connection': 'keep-alive',
'Content-Length': '0',
'Cookie':'__utmz=125772701.1629788009.10.7.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); ASP.NET_SessionId=1axaktzbcclgucnwmpq3snbw; __utmc=125772701; __utma=125772701.969281779.1625105148.1630400475.1630405677.15; __utmt=1; step=9; __utmb=125772701.2.10.1630405677',
'Host': 'www.foodchina.com.tw',
'Origin': 'http://www.foodchina.com.tw',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
resp = requests.post(url, data = data)
# 將 HTML 轉成 BeautifulSoup 物件
soup = BeautifulSoup(resp.text, 'html.parser')
activities = resp.json().["type"]
print(activities)
目前會在
activities = resp.json().["type"]
這行報錯,
錯誤訊息:
JSONDecodeError: Expecting value: line 1 column 1 (char 0)
我修改很多次依然一直卡在這行。
希望有人可以建議我如何修改,謝謝!
雖然看錯誤訊息感覺是抓下來的json字串本身格式就有問題了,但先把 .
拿掉吧
activities = resp.json()["type"]
.json()
後是字典的型態,取欄位值是用 dict["key"]
建議你把json字串印出來看到底哪裡錯了,希望有幫到你