[問題] 如何被網頁阻擋後,過幾秒重連線?

看板Python作者 (名器)時間9年前 (2016/04/08 23:00), 9年前編輯推噓3(3012)
留言15則, 6人參與, 最新討論串1/1
大家好!! 新手卡關再一問! 我想用urllib去urlopen一個網站 可是我有大量的資料要連續讀取 for example: for each_stock in stocks: req=urllib.urlopen("http://www.example/each_stock") table = req.find('table',{'class':'board') 可是因為我太頻繁讀取網站,網站會跳出一個網頁寫說 "太頻繁讀取,請稍後再來"(網址是一樣的) 這樣我就找不到我要的table 所以我想要請問 有沒有甚麼方法可以讓我可以過幾秒之後再回去讀取網頁? 我用過time.sleep(10)方式,等10s去讀沒有用QQ 在urlopen後面加上timeout=20也沒有用...因為不是被block的關係吧? 是被轉到內容(網址沒有變),所以加上timeout沒有用.... 卡了幾天了,懇請幫忙m(_ _)m -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.36.77.57 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1460127620.A.08D.html

04/08 23:13, , 1F
等10秒不夠就等20秒啊
04/08 23:13, 1F

04/08 23:28, , 2F
timeout 是指連不上的話在多久之後「放棄」, 不是你要的
04/08 23:28, 2F

04/08 23:28, , 3F
用 sleep 是最簡單的解, 至於要等多久就要看網站而定
04/08 23:28, 3F

04/08 23:35, , 4F
一樓最佳解XD 另外你可以多準備幾個 proxy 來讀
04/08 23:35, 4F

04/08 23:40, , 5F
urllib.request.ProxyHandler 
04/08 23:40, 5F
!!!!!!!!哈哈哈哈哈哈,一樓一語點醒我夢中人阿 剛剛發現更好的方法 用except: time.sleep(10) 這樣沒有成功就可以一直等了!!! 謝謝大家!!!! ※ 編輯: kiloxx (114.36.77.57), 04/09/2016 00:01:55

04/09 00:07, , 6F
其實你這樣time.sleep(10)改成20秒不夠好,你該試著
04/09 00:07, 6F

04/09 00:07, , 7F
讓程式碼依序停1秒或5秒
04/09 00:07, 7F

04/09 00:08, , 8F
time.sleep(randint(1,5))
04/09 00:08, 8F

04/09 00:08, , 9F
記得還要這一行from random import randint
04/09 00:08, 9F

04/09 00:40, , 10F
另外若你是對同一個網站下達抓取資料,建議多利用
04/09 00:40, 10F

04/09 00:40, , 11F
HTTP/1.1 的 keep-alive 方式連續抓取
04/09 00:40, 11F

04/09 00:41, , 12F
也就是一個 connection 下可以有多個 http request
04/09 00:41, 12F

04/09 00:42, , 13F
上面寫法會變成切斷連線之後重新產生一個新的連線
04/09 00:42, 13F

04/09 01:07, , 14F
建議可以裝 requests 替代要使用 keep alive 比較快
04/09 01:07, 14F

04/09 06:34, , 15F
也可以參考 header "Retry-After"
04/09 06:34, 15F
文章代碼(AID): #1N1yU42D (Python)
文章代碼(AID): #1N1yU42D (Python)