爬虫(03)面向对象写爬虫(函数,类,post有道翻译,requests)2020-12-16

本文介绍了如何使用面向对象编程思想重构爬虫代码,包括使用函数和类两种方式。还展示了如何利用requests模块进行POST请求,实现有道翻译功能,从获取翻译结果到解析JSON数据。最后探讨了requests模块的优势和源码学习。
摘要由CSDN通过智能技术生成

第三章 面向对象写爬虫有道翻译

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值