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

哈泥湖 发布于 2013/07/30 16:19
阅读 713
收藏 1
#! /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()
加载中
0
leo108
leo108
访问太频繁,豆瓣把你加入黑名单了
0
殊麒
殊麒

引用来自“leo108”的答案

访问太频繁,豆瓣把你加入黑名单了
这个可能性大
0
RoyChen
RoyChen

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

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

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

0
__FresHmaN
__FresHmaN
曾经我在豆瓣的fm听歌,因为切歌太快,就直接让我证明我不是机器人。。。。
0
华兹格
华兹格
@RoyChen @ 多萨穆大叔   像这种防止机器人的机制,是如何做到的〉?
0
durban
durban
本来就是,你主人家的东西要有做蜘蛛的风格好不好,你看看人家的roboot是怎么写的
0
余争
余争
要延迟2秒访问一次。
哈泥湖
我设置了1+ranint,应该有够2秒吧
0
RoyChen
RoyChen

引用来自“hanzhankang”的答案

@RoyChen @ 多萨穆大叔   像这种防止机器人的机制,是如何做到的〉?
@ hanzhankang 我就通俗一点说吧,对于你“是否是机器人”这件事,豆瓣大概对每个IP都有一个权值,那么你的访问过程,也就是PV的走势是一个离散的函数,我的想法是,对这个函数进行需要的建模,比如像下面同学说的,2s内有重复访问就加权(恭喜你向机器人又迈进了一步),或者再加上,该用户遇到一次访问屏障(输入验证码),就对此IP做长期加权(下次访问如果出现2s内重复加权更多就是这样),细节就是如何更好的定义和规划这个函数,这其实是一种用户行为分析,涉及到数据分析和挖掘了,肯定不是一蹴而就的,而且可以断定算法仍在完善中。
RoyChen
RoyChen
回复 @hanzhankang : 学而不思则罔
华兹格
华兹格
能简单 实现吗?需要数据库还是缓冲?如何设计?
0
真座山雕
真座山雕
豆瓣要申请appkey吧,而且限制每个Ip每分钟40次访问
0
CeeFee
CeeFee
其实就是伪造IP + 时间间隔
返回顶部
顶部