開發(fā)環(huán)境
Python 2.7.10
virtualenvs:隔離python開發(fā)環(huán)境
BeautifulSoup 3.2.1: html 解析三方庫
requests 2.13.0: http request三方庫
- sprider_craw.py: 添加要爬的小說url念颈。
- spider_db.py: 數(shù)據(jù)庫操作類,單例對象谓苟。
- spider_novel.py: 處理下載小說及相關(guān)章節(jié)晚唇。
- spider_novel.py: 更新已經(jīng)下載的未完結(jié)小說煎谍。
- spider_book_update.py: 更新已經(jīng)下載的未完結(jié)小說的狀態(tài)。
數(shù)據(jù)庫操作,采用的是單例模式:
單例的實現(xiàn):
#實現(xiàn)__new__方法
#并在將一個類的實例綁定到類變量_instance上,
#如果cls._instance為None說明該類還沒有實例化過,實例化該類,并返回
#如果cls._instance不為None,直接返回cls._instance
class Singleton(object):
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kw)
return cls._instance
如何防止被網(wǎng)址拒絕:采用多個User-Agent輪換方式枕磁,并且增加延時處理。
headers = ['Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B176 MicroMessenger/4.3.2',
'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19)',
'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0;Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)']
header = headers[random.randint(0, 2)]
request.add_header('User-Agent', header)
以上兩點在腳本中比較重要术吝,這里單獨列出來计济。