python爬虫学习笔记(3)

requests的基本使用

requests库是Python的一个第三方库,不是自带的,使用时需要额外安装。但是使用Anaconda3好像它已经帮我们加入了这个库。如果没有的话可以打开anaconda的命令窗口,输入

conda install requests

requests库相当时对python中的urllib库的一个简单的包装,使用起来更加方便,快捷。就比如一个最简单最基础的获取源码语句,使用request库是这样的,一个简单的get方法就完成了。

import requests

res = requests.get('https://www.baidu.com/')
print(res.text)

GET请求

上面的代码就是一个简单的GET请求,当客户端发起GET请求时,网站会判断并返回相应的请求信息,包括请求头Headers,请求所在IP地址等。

headers参数

在像一个http发起请求时,请求头如何设置,使用headers参数也是非常简单的。
就比如我们要设置User-Agent字段,可以

import requests

headers = {
	'User-Agent':'Mozilla/5.0'
}
res = requests.get('https://www.baidu.com/',headers=headers)

在headers中我们还可以任意添加其他的字段信息

params参数

对于GET请求,URL上面是可以往里面加入一些参数的,构造新的URL以达成所需要的请求。

import requests

res = requests.get('https://www.baidu.com/s?word=歪比巴卜')
#这个是构造了一个百度搜索关键字“歪比巴卜”的请求

但是手动拼接还是十分麻烦,这种时候我们可以使用params参数传递信息。就比如一下方式

import requests

data={
	'word':'歪比巴卜'
}
res = requests.get('https://www.baidu.com/s',params=data)
#这里将url参数通过字典的形式传递给get方法的params参数,而不用自己构造URL,十分方便

抓取二进制数据

以上我们所进行的都是抓取网页的源码,有html所编写而成的。而在网页中所展现的是很多精彩的图片及视频,想要抓取他们怎么办呢?
这些图片、视频以及音频都是由二进制码所编写而成,想抓取这些信息,就必须获取二进制数据。

import requests

res = requests.get('https://www.baidu.com/favicon.ico')
#这个是百度一下站点图标,就是标签页上的小图标
print(res.text)
#在获取是text将图片转换为str类型
print(res.content)
#content获取了其二进制原码

结果如下

�����������������������������������������������������������������
b’\x00\x00\x01\x00\x01\x00@@\x00\x00\x01\x00 \x00(

结果只展示了小部分,二进制代码量是非常大的。可以看到,前者text获取结果出现了乱码,后者content获取了二进制源码,首部有一个b’,表示的是byte,结果以16进制的代码序列展现出来
当然,就算提取出二进制码我们也是看不懂的,这就要将其保存为文件,以.ico方式打开了

import requests

res = requests.get('https://www.baidu.com/favicon.ico')
with open('favicon.ico','wb') as f:
    f.write(res.content)
#将得到的二进制数据,以二进制的方式写入favicon.ico文件中

最后到开favicon.ico文件,显示出了图标
百度一下,你就知道

POST请求

一个简单的post请求,将数据以表单的形式上传。网站判断请求方式,并返回相关请求信息。

import requests

data={
	'word':'歪比巴卜'
}
res = requests.post('https://www.baidu.com/s',params=data)

会有一个form字段进行表示

响应

在上面的例子中,我们获取相应后,只是使用了响应信息的text获取str,content获取二进制码,但其实响应的信息还有很多其他的方法,比如

res.status_code可以获取响应状态码
res.headers可以获取响应头
res.cookies可以获取Cookies
res.url可以获取URL
res.history可以获取请求历史

下面我们来简单使用一下

import requests

res = requests.get('https://www.baidu.com/')
print(type(res.status_code),res.status_code)
print(type(res.headers),res.headers)
print(type(res.cookies),res.cookies)
print(type(res.url),res.url)
print(type(res.history),res.history)

运行结果如下

<class ‘int’> 200
<class ‘requests.structures.CaseInsensitiveDict’> {‘Cache-Control’: ‘private, no-cache, no-store, proxy-revalidate, no-transform’, ‘Connection’: ‘keep-alive’, ‘Content-Encoding’: ‘gzip’, ‘Content-Type’: ‘text/html’, ‘Date’: ‘Tue, 30 Jun 2020 08:16:40 GMT’, ‘Last-Modified’: ‘Mon, 23 Jan 2017 13:24:45 GMT’, ‘Pragma’: ‘no-cache’, ‘Server’: ‘bfe/1.0.8.18’, ‘Set-Cookie’: ‘BDORZ=27315; max-age=86400; domain=.baidu.com; path=/’, ‘Transfer-Encoding’: ‘chunked’}
<class ‘requests.cookies.RequestsCookieJar’> <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
<class ‘str’> https://www.baidu.com/
<class ‘list’> []

对于响应状态码,requests库提供了一个状态码查询对象requests.codes,就比如requests.code.ok所代表的就是状态码200。更多返回码和相应查询条件可参考返回码和相应的查询条件

更多用法

文件上传

在某些网站时,如何模拟进行文件的上传呢,通过files参数就可以了,简单示例如下

import requests

files = {'file':open('favicon.ico','rb')}
res = requests.post('https://www.baidu.com/',files=files)

会有一个files字段进行标识

Requests库还有很多强大的功能,更多关于Requests库的用法可以参考Requests
以上部分代码只是方便学习,并无实质作用

一个简单的爬虫实操

获取网站流量排名

import re
import urllib.request
import urllib.parse
import random

url = "https://www.alexa.com/topsites"

h_list = [
          {"User-Agent":"Mozilla/5.0"},
          {"User-Agent":"Mozilla/4.0"},
          {"User-Agent":"Mozilla/3.0"},
    ]
headers = random.choice(h_list)

req = urllib.request.Request(url,headers=headers)
res = urllib.request.urlopen(req)
html = res.read().decode("utf-8")
p = re.compile('<a\shref="/siteinfo/.*?(\w+\.\w+)</a>',re.S)
res_list = re.findall(p,html)
for result in res_list:
    print(result)

运行结果如下

Google.com
Youtube.com
Tmall.com
Qq.com
Baidu.com
Facebook.com
Sohu.com
tmall.com
Taobao.com
Yahoo.com
360.cn
Jd.com
Amazon.com
Wikipedia.org
tmall.com
com.cn
Weibo.com
Live.com
Reddit.com
Zoom.us
Netflix.com
Xinhuanet.com
Microsoft.com
Vk.com
Okezone.com
Office.com
Instagram.com
Csdn.net
Alipay.com
Myshopify.com
co.jp
Blogspot.com
Twitch.tv
Bing.com
com.hk
Bongacams.com
Aliexpress.com
Ebay.com
Zhanqi.tv
Microsoftonline.com
Panda.tv
Naver.com
Tianya.cn
co.jp
Chaturbate.com
Tribunnews.com
Livejasmin.com
com.cn
co.in
Amazon.in

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值