Python实例:网络爬虫抓取豆瓣3万本书(4)

新的知识点:
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))




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值