作者kiloxx (名器)
看板Python
标题[问题] 如何被网页阻挡後,过几秒重连线?
时间Fri Apr 8 23:00:17 2016
大家好!! 新手卡关再一问!
我想用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://webptt.com/cn.aspx?n=bbs/Python/M.1460127620.A.08D.html
1F:推 CaptainH: 等10秒不够就等20秒啊 04/08 23:13
2F:→ uranusjr: timeout 是指连不上的话在多久之後「放弃」, 不是你要的 04/08 23:28
3F:→ uranusjr: 用 sleep 是最简单的解, 至於要等多久就要看网站而定 04/08 23:28
4F:→ s860134: 一楼最佳解XD 另外你可以多准备几个 proxy 来读 04/08 23:35
5F:→ s860134: urllib.request.ProxyHandler 04/08 23:40
!!!!!!!!哈哈哈哈哈哈,一楼一语点醒我梦中人阿
刚刚发现更好的方法
用except:
time.sleep(10)
这样没有成功就可以一直等了!!!
谢谢大家!!!!
※ 编辑: kiloxx (114.36.77.57), 04/09/2016 00:01:55
6F:推 busystudent: 其实你这样time.sleep(10)改成20秒不够好,你该试着 04/09 00:07
7F:→ busystudent: 让程式码依序停1秒或5秒 04/09 00:07
8F:→ busystudent: time.sleep(randint(1,5)) 04/09 00:08
9F:→ busystudent: 记得还要这一行from random import randint 04/09 00:08
10F:→ kenduest: 另外若你是对同一个网站下达抓取资料,建议多利用 04/09 00:40
11F:→ kenduest: HTTP/1.1 的 keep-alive 方式连续抓取 04/09 00:40
12F:→ kenduest: 也就是一个 connection 下可以有多个 http request 04/09 00:41
13F:→ kenduest: 上面写法会变成切断连线之後重新产生一个新的连线 04/09 00:42
14F:→ kenduest: 建议可以装 requests 替代要使用 keep alive 比较快 04/09 01:07
15F:推 eight0: 也可以参考 header "Retry-After" 04/09 06:34