Python爬虫入门
此专栏为Python爬虫入门到进阶学习。
话不多说,直接开始吧。
urllib模块
Python中自带的一个基于爬虫的模块,其实这个模块都几乎没什么人用了,我就随便写写了。
- 作用:可以使用代码模拟浏览器发起请求。(request、parse)
- 使用流程:
- 指定url
- 针对指定url发起请求
- 获取服务器响应回来的页面数据
- 持久化存储
1、urllib编写一个简单的爬虫程序
要求:爬取搜狗首页页面数据
注意,urllib等模块包需要通过pip下载,如果配置好了pip,直接pip install urllib就可以了,由于不是新手教程,就不再提及。
import urllib.request
#1.指定url
url = "https://www.sogou.com/"
#2.发起请求:urlopen可以根据指定url发起请求。且返回一个响应对象
#request是urllib的子模块,urlopen则是request的函数,表示打开一个url。括号里第一个url是urlopen的参数,则需要将url赋值给此url。
response = urllib.request.urlopen(url=url)
#3.获取页面数据,read函数返回的就是响应对象中存储的页面数据。
# 【这里解释下,response为何可以直接调用read函数,简单来说就是:urlopen( )函数返回的是一个HTTPResponse对象。
# 它包含了read( )、readinto( )、getheader(name)、getheaders( )、fileno( )等方法。
page_text = response.read()
#4.持久化存储,wb=二进制存储
with open('./sougou.html','wb') as f:
f.write(page_text)
print("写入数据成功。")
ok,这样的话就能爬取到一个简单的页面数据。
2、URL编码处理
如果我们想爬取的url里边带有中文的话,就要对URL进行编码处理。
import urllib.request
import urllib.parse
#指定URL
url = "https://www.baidu.com/baidu?ie=utf-8&wd=孙燕姿"
#发送请求
response = urllib.request.urlopen(url=url)
#获取页面资源
page_text = response.read()
#打印测试
print(page_text)
上述代码如果直接执行,就会报错。
如图,有一个UnicodeEncodeError的错误。
其实,在url中,不能存在非ASCII编码的字符数据,所以这里就会报错。
那么这里就要注意我们之前多引用了一个子模块parse,它就是来解决这个问题的
#quote函数的作用是能将URL中非ASCII码编码字符转码
word = urllib.parse.quote("孙燕姿")
print(word)
通过quote转码就能得出来孙燕姿的编码为
%E5%AD%99%E7%87%95%E5%A7%BF
这样用测试工具再一次转码,就能验证出来了。
根据上述,修复代码:
import urllib.request
import urllib.parse
#指定URL
url = "https://www.baidu.com/baidu?ie=utf-8&wd="
#quote函数的作用是能将URL中非ASCII码编码字符转码
word = urllib.parse.quote("孙燕姿")
#发送请求,这里需要将转码后的字符拼接起来
response = urllib.request.urlopen(url=url + f"{word}")
#获取页面资源
page_text = response.read()
#持久化存储
with open("yanzi.html","wb") as f:
f.write(page_text)
3、UA身份伪装
什么是UA呢?
UA指的是User-Agent,这是浏览器的身份标识,用于表明浏览器类型、操作系统和版本号等信息。User-Agent字符串被网页服务器用来识别访问者的浏览器信息,从而提供相应的页面内容或功能。例如,不同的浏览器会有不同的User-Agent字符串,如Chrome、Firefox等。通过修改User-Agent,用户可以“假装”使用不同的浏览器,实现一些特定的网络操作或访问一些特定设计的网页内容。
从浏览器自带的开发这工具里,通过请求头就能很好的查看UA等信息。
- 反爬机制:网站会检查请求UA,如果发现UA是爬虫,则会拒绝提供网站数据。
- User-Agent:请求载体的身份。
- 反反爬机制:伪装爬虫程序请求的UA
下面就来试试吧
import urllib.request
#确认爬虫URL
url = "https://www.baidu.com/"
#伪装UA
#1.自制定请求对象。 Request是request的一个函数,用来自制定请求对象。headers参数是头信息。
#赋值成字典形式的信息。ua可以去网站上复制,也可以随便给一个。
headers = {
"User-Agent" :
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0"
}
#该请求对象的UA进行伪装
request = urllib.request.Request(url=url, headers=headers)
#2.针对自制定的请求对象发起请求
response = urllib.request.urlopen(request)
#持久化存储
with open("baidu.html", "wb") as f:
f.write(response.read())
ok,这里其实才能算得上一个初步的爬虫。
四、post请求
以上都是一些get请求,下面来试试post请求。
需求:获取百度翻译的翻译结果。
比如这里输入水,网页就会实时的翻译为water
首先要先找到这个而请求。
同样,打开浏览器开发者模式,选择翻译软件,请求筛选XHR,这个就可以筛选出来AJAX请求(就是异步js和xml)
然后根据XHR的请求找到这个对于的请求。
请求头里的表单数据kw是用于提交给服务器的数据。
在HTTP请求中,表单数据通常用于提交信息到服务器。kw作为表单数据的一部分,用于指定要提交的具体内容。在构建HTTP请求时,表单数据可以通过请求头中的特定字段进行传输,以便服务器能够正确处理这些数据。
消息头里便能找到post的请求URL
https://fanyi.baidu.com/sug
代码如下:
import urllib.request
import urllib.parse
#1.指定URL
url = "https://fanyi.baidu.com/sug"
#2.需要对post请求携带的参数处理
#流程: 1、post请求参数封装到字典中
data = {
"kw":"水"
}
#2.使用parse模块中的urlencode进行编码处理,返回值为字符串类型
data = urllib.parse.urlencode(data)
# print(type(data))
#3.将步骤2的编码结果转换成byte类型
data = data.encode()
#3.发起post请求,data参数表示的就是经过处理之后的post请求携带的参数。
response = urllib.request.urlopen(url=url, data=data)
response = response.read()
print(response)
拿到运行结果之后,可以去校验json
- {“errno”:0,“data”:[{“k”:“\u6c34”,“v”:“\u540d. water; river; a general term for rivers, lakes,”},{“k”:“\u6c34\u4e0a”,“v”:“water; aquatic ; overwater; water borne”},{“k”:“\u6c34\u4e0b”,“v”:“underwater; undersea; [\u7535\u5f71]Underwater!”},{“k”:“\u6c34\u4e2d”,“v”:“water ; aquatic”},{“k”:“\u6c34\u4e91”,“v”:“water cloud; water clouds”}],“logid”:1036407526}
结果如下:
如此,基于post请求完成。主要是针对post请求参数进行处理。
五、urllib高级操作
urllib高级操作有两部分,一是代理,而是基于Cookie的cookie操作。代理和cookie在爬虫中使用还是比较多的,但是我们基本不会使用基于urllib的代理和cookie,因为基于该模块的代理和cookie比较繁琐并且效率较低,通常情况下,我们一般使用基于requests模块或者其他模块的代理和cookie操作,所以这里了解就好,不展开演示。