目录
1、百度首页
2、百度贴吧
3、百度翻译
1、简单入门 - 爬取百度首页:
1)、先导入包模块
import requests
2)、准备爬取工作(比如目标网址)
url = 'https://www.baidu.com/'
3)、开始发起爬取请求(这里是 get 请求)
response = requests.get(url=url)
4)、查看响应内容
print(response.text)
到这里简单的爬取百度首页就算是完成了,但我们会发现其返回的信息是乱码的(但也仅是首页乱码,若查看其它资料后显示还是正常的):
我们将其保存成文件,打开看看:
with open('baidu.html','w',encoding='utf-8') as fp: #第一个参数表示文件名,第二个参数表示写操作,第三个参数表示编码格式
fp.write(response.text)
之后我们找到保存的文件:
然后打开,运行(最好是有谷歌,方便我们去查看网页源码):
打开网页后,发现首页文字确实是乱码的,这是因为我们获取网页的方法错了,不能用 .text 方式,text 是提取的文本类信息,在爬取有的网站的时候,并没有对该文本去编码,所以我们爬下来后也是乱码的,但有的网站可以用,下面爬取贴吧的时候就可以。既然乱码了,那我们就给它再编码一下,这里我们用 content 形式 ,content 是表示的字节流信息,返回的是图片、音频、视频等信息,使用方法如下:
print(response.content.decode('utf-8'))
打印这条语句后,我们发现已经改过来了,在网页中(保存的那个 baidu.html 文件)打开也是正常的,这样简单的百度首页就爬取完成了,下面给上完整代码:
# 1、导入包模块
import requests
# 2、准备爬取工作 百度网址: https://www.baidu.com/
url = 'https://www.baidu.com/'
# 3、发起请求
response = requests.get(url=url)
# print(response) #验证是否正确
# 4、查看响应信息
# print(response.text)
# 6、乱码调整
print(response.content.decode('utf-8'))
# 5、将爬取内容保存为文件
with open('baidu.html','w',encoding='utf-8') as fp: #第一个参数表示文件名,第二个参数表示写操作,第三个参数表示编码格式
fp.write(response.content.decode('utf-8'))
上面我们爬取了百度首页,这次我们不是单纯地爬取贴吧首页,那样就跟上面重复了,当然改动的地方也不多,毕竟刚入门,都是一些简单的知识。我们这次要做的是,通过我们用户在控制台输入我们想查看的贴吧,然后给我们生成其对应的网页文件,打开后就是我们想看的贴吧网页, 相比上面的,改的地方确实不多,主要是用到了一个 format() 方法(想具体了解 format 方法的使用见 format 详解 ) ,下面开始说明一下:
导入包、准备网址、发起请求这些工作都是必备的,跟上面也都差不多,但要注意的是,既然我们想去获取不同的贴吧,那我们就要去看看这些不同贴吧的网址有什么区别,下面准备几个贴吧的网址:
# python:
https://tieba.baidu.com/f?ie=utf-8&kw=python&fr=search
# java:
https://tieba.baidu.com/f?ie=utf-8&kw=java&fr=search
# c:
https://tieba.baidu.com/f?ie=utf-8&kw=c&fr=search
我们发现这几个网址最前面是百度贴吧的网址,f? 后面是一样的格式,我们注意到 kw 值是不一样的,而它们就是我们输入的内容,那么我们就试着将这部分改改,看结果对不对,下面是完整代码:
import requests
#模拟百度贴吧
# 百度贴吧网址 :https://tieba.baidu.com/
# python 吧 网址:https://tieba.baidu.com/f?ie=utf-8&kw=python&fr=search
# java 吧 网址 :https://tieba.baidu.com/f?ie=utf-8&kw=java&fr=search
# 发请求
# 1)、获取请求的贴吧名称
name = input('请输入想要查询的贴吧名称:\n')
# 2)、构建完整的 URL
url = 'https://tieba.baidu.com/f?ie=utf-8&kw={}&fr=search'.format(name)
# print(url)
# 3)、发送请求:
requests = requests.get(url=url)
# print(requests)
# 4)、保存 : 文件中只能写入字符串类型
with open('{}.html'.format(name),'w',encoding='utf-8') as fp:
fp.write(requests.text)
# text 方式在有些网站访问会乱码,但有的已经编码过了,所以不会出现乱码
我们将生成的目标文件打开运行后,发现就是我们所爬取的目标网页,这里就简单把贴吧爬取完了,但是有的网页是我们爬不到的,这是因为网页设置了反爬虫机制,至于怎么去绕过这个保护机制,一般情况下加 useragent 代理都可以解决,我的另一篇博客中用到了这个,见博客:豆瓣电影 。
百度翻译相比于贴吧又有不一样了,如果这次我们还是按上面的方法,查询几个单词后,观察它们网址的不同,去替换关键字,如:
hello : https://fanyi.baidu.com/?aldtype=16047#en/zh/hello
job : https://fanyi.baidu.com/?aldtype=16047#en/zh/job
china : https://fanyi.baidu.com/?aldtype=16047#en/zh/china
我们可以先拿一个网址去试一下:
#百度翻译
import requests
url = 'https://fanyi.baidu.com/?aldtype=16047#en/zh/china'
response = requests.get(url=url).text
with open('china.html','w',encoding='utf-8') as fp:
fp.write(response)
我们会发现运行之后是百度翻译首页,而不是我们查询单词后的页面,这是因为网址中 # 后面的内容被注释掉了,下面需要我们去找一下我们输入的具体在什么位置。
打开百度翻译首页,查看其源码,找到网络部分:
接下来,我们每输一个 字符 ,我们看右边都有哪些文件在变动,图片等格式就不用看了,毕竟我们的网页信息不会以图片形式保存,然后我们观察后会发现,每输一个 字符,会多生成一个 sug 文件(不同网站,找到的文件不一样,刚开始就是要一个一个摸索):
然后我们查看 sug 文件:
这里我们就找到了,下面我们开始写程序去获取目标:
1)、网址(注意!)
url = 'https://fanyi.baidu.com/sug'
2)、准备数据
name = input('请输入需要翻译的文字、字符或句子:')
data = {'kw':'{}'.format(name)}
3)、发起请求(这里要用 post 请求)
response = requests.post(url=url,data=data)
4)、简单测试一下
# 注意是 json 形式,如果用 .text 格式的话,返回的是 json 格式,即键值对形式,所以这里直接用 json ()
print(response.json())
5)、读取输出(提取 json 信息)
我们这次爬取的内容和前面有些不一样,返回的是 json 格式的信息,我们可以查看一下:
为方便我们查看信息,可以将其保存为 json 文件后查看:
#注意文件名后缀 .json
with open('fanyi.json','w',encoding='utf-8')as fp:
fp.write(response.text)
打开保存的文件:
json 字符串即 键值对 方式显示,如果我们爬取的内容是以 json 形式,那么我们在读取的时候还需要转换成 python 类型
# 提取 json 信息 ,json 字符串转换为 python 类型,例如:列表、字典
#如果返回的是 json 字符串,即 键值对 方式显示,那么就需要将其转换为 json 形式,并将其转换为 python 类型:response.json()
# print(type(response.json())) #字典类型
content = response.json()
for i in content['data'] :
print(i)
到现在简单的百度翻译就已经完成了,下面给出完整的代码:
#百度翻译
import requests
# 目标网址
url = 'https://fanyi.baidu.com/sug'
name = input('请输入需要翻译的文字、短语或句子:\n')
# 创建一个字典类型,存取数据
data = {'kw':'{}'.format(name)}
# 发起请求
response = requests.post(url=url,data=data)
# 将 json 格式转换为 python 类型
content = response.json()
for i in content['data']:
# print(i)
word = i['k']
fanyi = i['v']
print(word, ':', fanyi)
pass