开发者社区> 问答> 正文

简单写了个抓豆瓣资料的程序,为什么抓不到一会就报错?报错

#! /usr/bin/env python #coding='utf-8'

import urllib,urllib2 from bs4 import BeautifulSoup as bs import socket import time,requests from time import sleep import MySQLdb import sys,random

reload(sys) sys.setdefaultencoding('utf-8')

proxy

proxy_support = urllib2.ProxyHandler({'http':'http://23.29.127.173:8089'})

opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)

urllib2.install_opener(opener)

conn = MySQLdb.connect(host="localhost",user="root",passwd="psw",charset="UTF8") conn.select_db('moviedownload') cur=conn.cursor() cur.execute("""select * from movie_type_douban """) conn.commit()

tag_list=[] for i in cur.fetchall(): for j in range(0,500,20): tag_list.append('http://movie.douban.com/tag/' + i[0] +'?start=' + str(j) +'&type=T')

for url in tag_list: try: r = requests.get(url) tr = bs(urllib.urlopen(url).read().decode("utf-8","ignore")).find("div",{"id":"subject_list"}).findAll("tr",{"class":"item"}) list = [] for div in tr: movie_name = div.find("div").find("a").get_text() # movie_name movie_score = float(div.find("div").find("span",{"class":"rating_nums"}).get_text()) # movie_score movie_url = div.find("div").find("a")["href"] value= (movie_url,movie_name.encode("utf-8"),movie_score,time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))) list.append(value) cur2=conn.cursor() cur2.executemany("""insert into movie_url_douban values(%s,%s,%s,%s)""",list) print "Total insert "+ str(len(list)) + " movies!" tr.decompose() time.sleep(random.randint(1,10)*0.1+1) except: print url+ " erro!" time.sleep(random.randint(1,10)*0.1+1) continue conn.close()

展开
收起
爱吃鱼的程序员 2020-06-22 17:54:43 393 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    访问太频繁,豆瓣把你加入黑名单了<divclass="ref">

    引用来自“leo108”的答案

    <divclass=ref_body>访问太频繁,豆瓣把你加入黑名单了

    这应该是豆瓣的防止恶意访问机制。

    你可以试一下,如果在一直点击豆瓣的一个相同功能链接,不久就会弹出输入验证码的界面,它会认为你是“机器”,然后向你求证你是否是人类(汗颜),所以,你肯定是遇到验证码页面然后再也进行不下去了。

    同时,豆瓣应该还有一种IP的限制,如果你遇到的验证码页面较多(就是说你比较像是一个“机器人”),那你以后就会“更快”的遇到验证码。所以,不出所料的话,你再去刷获取的信息会更少。

    曾经我在豆瓣的fm听歌,因为切歌太快,就直接让我证明我不是机器人。。。。<aclass='referer'target='_blank'>@RoyChen@<atarget="_blank"rel="nofollow">多萨穆大叔<spanstyle="color:#666666;font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:12px;line-height:normal;background-color:#FFFFFF;"> 像这种防止机器人的机制,是如何做到的〉?本来就是,你主人家的东西要有做蜘蛛的风格好不好,你看看人家的roboot是怎么写的要延迟2秒访问一次。我设置了1+ranint,应该有够2秒吧<divclass="ref">

    引用来自“hanzhankang”的答案

    <divclass=ref_body><aclass='referer'target='_blank'>@RoyChen@<atarget="_blank"rel="nofollow">多萨穆大叔<spanstyle="color:#666666;font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:12px;line-height:normal;background-color:#FFFFFF;"> 像这种防止机器人的机制,是如何做到的〉?回复<aclass='referer'target='_blank'>@hanzhankang:学而不思则罔能简单实现吗?需要数据库还是缓冲?如何设计?豆瓣要申请appkey吧,而且限制每个Ip每分钟40次访问其实就是伪造IP+时间间隔

    2020-06-22 17:54:59
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载