新的知识点:
1.re模块,正则表达式
表达式中的分组:
组是通过 "(" 和 ")" 元字符来标识的。 "(" 和 ")" 有很多在数学表达式中相同的意思;它们一起把在它们里面的表达式组成一组。
2.time模块,日期和时间相关的模块
每个时间戳都以自从1970年1月1日 00:00:00过了多长时间来表示。
详细内容:http://blog.csdn.net/u012175089/article/details/62044335
3.urllib模块,处理url相关的东西
4.os.path.isfile检测的是路径
os.listdir返回的是字符串list。
如果直接用这个字符串去isfile的时候,一般是回报错的。
isfile检测的位置是当前位置,即是'.'。所以要把rootdir加进去。
for path in os.listdir(rootdir):
if os.path.isfile(os.path.join(rootdir,path)) and path.endswith(prefix):
file.append(path)
print(path)
5.string.format()使用很方便。
insertbooksql = "INSERT INTO `book`
(`bookname`, `bookurl`, `bookimg`, `bookinfo`, `bookstar`, `bookno`)
VALUES ('" \"{bookname}', '{bookurl}', '{bookimg}', '{bookinfo}', '{bookstar}', '{bookno}')"
insert1 = insertbooksql.format(
bookname=bookname,
bookurl=bookurl,
bookimg=bookimage,
bookinfo=bookinfo,
bookstar=bookstar, bookno=bookno)
1.re模块,正则表达式
表达式中的分组:
组是通过 "(" 和 ")" 元字符来标识的。 "(" 和 ")" 有很多在数学表达式中相同的意思;它们一起把在它们里面的表达式组成一组。
2.time模块,日期和时间相关的模块
每个时间戳都以自从1970年1月1日 00:00:00过了多长时间来表示。
详细内容:http://blog.csdn.net/u012175089/article/details/62044335
3.urllib模块,处理url相关的东西
4.os.path.isfile检测的是路径
os.listdir返回的是字符串list。
如果直接用这个字符串去isfile的时候,一般是回报错的。
isfile检测的位置是当前位置,即是'.'。所以要把rootdir加进去。
for path in os.listdir(rootdir):
if os.path.isfile(os.path.join(rootdir,path)) and path.endswith(prefix):
file.append(path)
print(path)
5.string.format()使用很方便。
insertbooksql = "INSERT INTO `book`
(`bookname`, `bookurl`, `bookimg`, `bookinfo`, `bookstar`, `bookno`)
VALUES ('" \"{bookname}', '{bookurl}', '{bookimg}', '{bookinfo}', '{bookstar}', '{bookno}')"
insert1 = insertbooksql.format(
bookname=bookname,
bookurl=bookurl,
bookimg=bookimage,
bookinfo=bookinfo,
bookstar=bookstar, bookno=bookno)
第四步是将各个标签的书列表抓取到本地。
# -*- coding:utf-8 -*-
import time
from tool.ExcelManager import listFiles,readExcel
from tool.ProxyManager import makeProxyAddress
import urllib.parse
import os
from tool.HtmlManager import getHtml,getBinaryHtml
import re
# 抓取各标签列表页
"""
输入参数为:
requireip 是否使用代理,默认否
v 是否限制爬虫速度,默认否,时间为1秒仿人工
lockprefix 文件加锁后缀
"""
requreip = 0
lockprefix= 'html'
v = 2
# 进行计时
startTime = time.clock() #开始时间
tagList = readExcel('web/booktag.xlsx') # 从excel文件中读取标签列表。返回序列
proxyAddress = makeProxyAddress()# 代理IP数组
changeIP = 0 # 代理IP数组
# 循环对标签进行抓取
for i in range( 1, len( tagList ) ):
tagType = tagList[i][0] # 大分类
tagName = tagList[i][1] # 标签名
tag = urllib.parse.quote(tagName) # url中文转码
localDir = 'web/'+tagType
# 先构建目录,已经存在就不需要
if os.path.exists(localDir):
pass
else:# 否则新建
print('新建大分类:'+localDir)
os.makedirs(localDir)
mulu = localDir+'/'+tagName
# 存在标签文件夹则跳过
if os.path.exists(mulu):
pass
else: # 否则新建方便网页存放
print('新建标签文件夹'+mulu)
os.makedirs(mulu)
# 网络中断后重新抓取时判断是否加锁
ok = listFiles(mulu, '.'+lockprefix)
if ok:
print('类别:'+tagType+'----标签:'+tagName+'----已经抓完') # 抓完
continue
url = 'http://www.douban.com/tag/'+tag+'/book?start=' # 基础网址
pagesize = 15 # 每页15本
i = 0 # 翻页助手
while(True):
# 需要爬取的网页
site = url+str(i*pagesize)
# 开始爬取
# 构造文件名称
# web/小说/0.html
src = mulu+'/'+str(i*15)+'.html'
# 判断文件是否存在,存在则不抓取节省时间
if(os.path.exists(src) == True):
pass
else:
# 写入本地文件
print('准备抓取:【'+site+'】 类别:【'+tagType+'】 标签:【'+tagName+'】')
iprefuse = 1 # 如果抓取成功设为0
# 如果抓取出错那重新抓取
while iprefuse:
try:
daili1= proxyAddress[changeIP] # 代理ip
# 爬虫速度控制
if v:
a = time.clock()#初试时间
time.sleep(v)
b = time.clock()
print('时间暂停:'+str(v))
print('真实时间暂停(Unix CPU时间,Windows 真实时间):'+str(b-a))
# 不需要代理
if requreip==0:
# 获得网址内容
webcontent = getHtml(site).encode('utf-8') # 爬取
#搜索是否出现dl标签
notnull = re.search(r'<dl>',webcontent.decode('utf-8','ignore')) # 匹配看是否抓取到末页
else: # 需要代理
print('代理:'+daili1)
webcontent = getBinaryHtml(site, daili1)
# 获取网址内容
notnull = re.search(r'<dl>',webcontent.decode('utf-8','ignore'))
iprefuse = 0# 抓完设置0
except Exception as e:#抓取过程中出错。
print(e)
if requreip:#换一个ip试试
changeIP = changeIP+1 # 更换ip下标
if changeIP==len(proxyAddress): # 到达ip数组末循环再来
changeIP = 0
print('更换代理:'+proxyAddress[changeIP])
else:
print("IP被封")
raise
# break
# 如果抓不到<dl>标签,证明已经抓取完
if notnull:
webfile = open(src, 'wb')#保存网页到本地
webfile.write(webcontent)
webfile.close()
print("已经抓取:"+site+'类别:'+tagType+'----标签:'+tagName)
else:
lock = open(src.replace('html',lockprefix),'w') # 抓取完毕了
# 日期:http://blog.csdn.net/u012175089/article/details/62044335
finish = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
lock.write('抓取完成时间:'+finish)
print("抓取完毕:"+tagName)
break
i =i + 1 # 加页
# 计时
endTime = time.clock()
print("爬取总共运行时间 : %.03f 秒" %(endTime-startTime))