iT邦幫忙

0

python 爬蟲 問題

爬蟲網站:http://www.foodchina.com.tw/model/marketing/AnaChartNew.aspx?id=51&ChkID=297&Page=0&Type=1&cn=False

該網站需要先利用篩選器選擇你要的資料,
(類別:全選,價格:全選,區間:日,2018年1月31日前31天走勢圖)


程式碼執行後會導到
https://ithelp.ithome.com.tw/upload/images/20210831/20136579vBF01JLmrv.png
這個畫面,
我想爬蟲
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)

我修改很多次依然一直卡在這行。

希望有人可以建議我如何修改,謝謝!

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
Andy Chiang
iT邦新手 4 級 ‧ 2021-09-01 00:16:23

雖然看錯誤訊息感覺是抓下來的json字串本身格式就有問題了,但先把 . 拿掉吧

activities = resp.json()["type"]

.json() 後是字典的型態,取欄位值是用 dict["key"]

建議你把json字串印出來看到底哪裡錯了,希望有幫到你

我要發表回答

立即登入回答