# 程序结构
class xxxSpider(object):
def __init__(self):
# 定义常用变量,比如url或计数变量等
def get_html(self):
# 获取响应内容函数,使用随机User-Agent
def parse_html(self):
# 使用正则表达式来解析页面,提取数据
def write_html(self):
# 将提取的数据按要求保存,csv、MySQL数据库等
def run(self):
# 主函数,用来控制整体逻辑
#每爬取一个页面随机休眠1-2秒钟的时间
time.sleep(random.randint(1,2))
if __name__ == '__main__':
# 程序开始运行时间
spider = xxxSpider()
spider.run()
实战:爬取贴吧搜索贴的指定面
from urllib import request,parse
import time
import random
from ua_info import us_list
#目标:只抓取贴吧的指定页
# 定义爬虫类
class MySpider(object):
#初始化url属性
def __init__(self):
self.url = 'http://tieba.baidu.com/f?{}'
#请求函数
def get_html(self,url):
req = request.Request(url=url,headers={'User-Agent':random.choice(us_list)})
res = request.urlopen(req)
#windows会存在乱码问题,需要使用 gbk解码,并使用ignore忽略不能处理的字节
#linux不会存在上述问题,可以直接使用decode('utf-8')解码
html = res.read().decode('gbk','ignore')
return html
#解析函数:解析 HTML 页面
#模块有正则解析模块、bs4 解析模块
def parse_html(self):
pass
#保存函数
def save_html(self,filename,html):
with open(filename, 'w') as f:
f.write(html)
#入口函数
def run(self):
name = input('请输入贴名:')
begin = int(input('请输入开始页:'))
stop = int(input('请输入开始页:'))
for page in range(begin, stop + 1):
pn = (page-1)*50
params = {
'kw':name,
'pn':str(pn)
}
params = parse.urlencode(params)
url = self.url.format(params)
#发请求
html = self.get_html(url)
#保存文件
filename = '{}-{}.html'.format(name,page)
self.save_html(filename,html)
#提示
print('第%d页抓取成功'%page)
#每爬取一个页面随机休眠1-2s
time.sleep(random.randint(1,2))
if __name__ == '__main__':
start = time.time()
spider = MySpider() #实例化一个对象
spider.run()
end = time.time()
#程序执行时间
print('执行时间:%.2f' % (end - start))