Python抓取美女数据时,连接超时的问题

2016-03-26 20:22:52
python中使用urllib2访问网页时,出现timeout的解决办法,以及如何重新尝试链接
最近,要从一个时尚网站抓取一些模特美女信息,充实到我们的app里,尽管我们的app跟时尚没一点儿关系。
程序的思路很简单,先从模特列表页面或者搜索结果页面把每个模特的详情页面的地址都采集下来,然后再挨个的访问每个模特的页面,把她的信息(艺名、年龄、身高等)以及照片匹配然后保存,至于保存,可以存在文本文件中,也可以保存在数据库里。

我找的这个网站更简单,每个模特的详细页面的url是这样的, model_info.php?id=73,id就是模特的编号,我翻了翻网站,找到了最新模特介绍,看到最新的模特id是 8620,这样就循环一下就可以了。

于是写了个脚本,大致是这样的


# coding=utf-8

import urllib2
import re
import time
import MySQLdb
from urllib2 import URLError


'''获取某个网页的html源码'''
def fetch_model_detail(url):
    global pid,cursor
    
    headers = { 'User-Agent' : 'Mozilla/5.0' }
    req = urllib2.Request(url, None, headers)
    html_content=""
    try:
        html_content = urllib2.urlopen(req).read()
    except  Exception , what:
        print "Error"

    return html_content

for i in range(1,8620):
    content = fetch_model_detail("http://www.model-web-site.com/model_info.php?id="+i)
    print "正在提取第%s个美女资料"%i
    #提取相关个人资料

    #保存到mysql数据库  


于是运行脚本, python fetch_model.py,看着满屏幕的滚动的信息就好像看到了一个个活生生的美女一样,

正在提取第19个美女资料
正在提取第20个美女资料
正在提取第21个美女资料
正在提取第22个美女资料
正在提取第23个美女资料
正在提取第24个美女资料
正在提取第25个美女资料
正在提取第26个美女资料
正在提取第27个美女资料
正在提取第28个美女资料
正在提取第29个美女资料
正在提取第30个美女资料
正在提取第31个美女资料
正在提取第32个美女资料

可是到了这id=32的时候,屏幕就不动了,而且是好久不动,也不知是死是活,没办法只好改改程序,从第33个开始,重新运行,可是没多久又不动了,真是让人着急。

于是,看了看程序,google了一下,找到了解决办法,就是给urllib2.open方法加上超时时间,比如30秒,过了30秒再重试,改进后的代码是这样的:


'''获取某个网页的html源码'''
def fetch_model_detail(url,retries=3):
    global pid,cursor
    
    headers = { 'User-Agent' : 'Mozilla/5.0' }
    req = urllib2.Request(url, None, headers)
    html_content=""
    try:
        html_content = urllib2.urlopen(req,None,60).read()
    except  Exception , what:
        if retries>0:
            print "retry"
            return fetch_model_detail(url,retries-1)

    return html_content

加上了连接超时时间60秒,超时以后,重试3次


这样,程序就唰唰一次性的把8000多个美女资料下载下来了。