文章目录
第三章 面向对象写爬虫有道翻译
1. 写一个爬帖子的项目
我们先打开百度贴吧输入“海贼王”,然后随便打开两页,复制一下url,研究一下规律。
https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&ie=utf-8&pn=50
https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&ie=utf-8&pn=100
以上是我点开的第二页和第三页的url,经过观察我们可以看到这样的规律
https://tieba.baidu.com/f? # 基本的url
kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B # 这个应该是我们输入的关键字的16进制编码
&ie=utf-8 # 这个是译码的
&pn=50 # 这个应该是页码有关的数字
# 我们看到页码的规律是(页数-1)×50
我们可以构建要抓取页的url了,下面是面向过程的代码:
# 百度贴吧项目
'''
https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&ie=utf-8&pn=50
https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&ie=utf-8&pn=100
'''
import urllib.request
import urllib.parse
base_url = 'https://tieba.baidu.com/f?'
start_page = int(input('请输入起始页:'))
end_page = int(input('请输入结束页:'))
key = input('请输入你要搜索的主题:')
kw = {'kw':key}
kw = urllib.parse.urlencode(kw)
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'}
for i in range(start_page,end_page+1): # 因为range()函数的特点是左含右不含,所以要加上1才能够输出结束页
pn = (i-1)*50
url = base_url+kw+'&ie=utf-8'+'&pn='+str(pn) # 这里要转换成字符串才能拼接
req = urllib.request.Request(url,headers=headers)
res = urllib.request.urlopen(req)
html = res.read().decode('utf-8')
with open(r'D:\spiderdocuments\tieba_{}_page_{}.txt'.format(key,i),'w',encoding='utf-8') as f:
f.write(html)
print(f'第{i}页已经成功写入!')
print('程序执行完毕')
在我输入相关的信息后,这个执行结果就是在我的相应盘里多出来这么几个文件
2. 面向对象编程
我们可以将上述代码用面向对象编程的思想来尝试编写
2.1 使用函数对象编程
我大概把面向过程编程的内容分成以下几个步骤:
- 抓取网页 生成要写入文本的内容
- 写入文本
- 主程序 生成抓取网页需要的url
- 主入口判断语句
所以我大概可以先写这样一个框架
import urllib.request
import urllib.parse
def readpage(url):
pass
def writepage(filename,html)
pass
def main():
pass
if __name__ == '__main__':
main()
下面我们把必要的内容移入各自的函数,得到如下结果:
# 面向对象,函数
import urllib.request
import urllib.parse
def readpage(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'}
req = urllib.request.Request(url, headers=headers)
res = urllib.request.urlopen(req)
html = res.read().decode('utf-8')
return html
def getpage(filename, html):
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
pri