图1:静态网页分析判断(点击看高清图)
https://tieba.baidu.com/f?ie=utf-8&kw=python爬虫&fr=search
点击第二页,其 url 信息如下:https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=50
点击第三页,url 信息如下:https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=100
重新点击第一页,url 信息如下:https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=0
如果还不确定,您可以继续多浏览几页。最后您发现 url 具有两个查询参数,分别是 kw 和 pn,并且 pn 参数具有规律性,如下所示:第n页:pn=(n-1)*50 #参数params pn=(page-1)*50 params={ 'kw':name, 'pn':str(pn) }url 地址可以简写为:
https://tieba.baidu.com/f?kw=python爬虫&pn=450
from urllib import request,parse import time import random from ua_info import ua_list #使用自定义的ua池 #定义一个爬虫类 class TiebaSpider(object): #初始化url属性 def __init__(self): self.url='http://tieba.baidu.com/f?{}' # 1.请求函数,得到页面,传统三步 def get_html(self,url): req=request.Request(url=url,headers={'User-Agent':random.choice(ua_list)}) res=request.urlopen(req) #windows会存在乱码问题,需要使用 gbk解码,并使用ignore忽略不能处理的字节 #linux不会存在上述问题,可以直接使用decode('utf-8')解码 html=res.read().decode("gbk","ignore") return html # 2.解析函数,此处代码暂时省略,还没介绍解析模块 def parse_html(self): pass # 3.保存文件函数 def save_html(self,filename,html): with open(filename,'w') as f: f.write(html) # 4.入口函数 def run(self): name=input('输入贴吧名:') begin=int(input('输入起始页:')) stop=int(input('输入终止页:')) # +1 操作保证能够取到整数 for page in range(begin,stop+1): pn=(page-1)*50 params={ 'kw':name, 'pn':str(pn) } #拼接URL地址 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-2秒钟的时间 time.sleep(random.randint(1,2)) #以脚本的形式启动爬虫 if __name__=='__main__': start=time.time() spider=TiebaSpider() #实例化一个对象spider spider.run() #调用入口函数 end=time.time() #查看程序执行时间 print('执行时间:%.2f'%(end-start)) #爬虫执行时间程序执行后,爬取的文件将会保存至 Pycharm 当前工作目录,输出结果:
输入贴吧名:python爬虫 输入起始页:1 输入终止页:2 第1页抓取成功 第2页抓取成功 执行时间:12.25以面向对象方法编写爬虫程序时,思路简单、逻辑清楚,非常容易理解,上述代码主要包含了四个功能函数,它们分别负责了不同的功能,总结如下:
# 程序结构 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): # 主函数,用来控制整体逻辑 if __name__ == '__main__': # 程序开始运行时间 spider = xxxSpider() spider.run()注意:掌握以上编程逻辑有助于您后续的学习。
#每爬取一个页面随机休眠1-2秒钟的时间 time.sleep(random.randint(1,2))爬虫程序访问网站会非常快,这与正常人类的点击行为非常不符。因此,通过随机休眠可以使爬虫程序模仿成人类的样子点击网站,从而让网站不易察觉是爬虫访问网站,但这样做的代价就是影响程序的执行效率。
聚焦爬虫是一种执行效率较低的程序,提升其性能,是业界一直关注的问题,由此也诞生了效率较高的 Python 爬虫框架 Scrapy。
本文链接:http://task.lmcjl.com/news/15424.html