网页抓取数据百度百科(参数解码和解码函数urlencode函数用浏览器发送请求的方法)
优采云 发布时间: 2021-12-27 06:10网页抓取数据百度百科(参数解码和解码函数urlencode函数用浏览器发送请求的方法)
本文内容
前言
继续学习python,这次学习爬虫,听说比较好玩,我也学习了。
什么是网络爬虫?爬虫的实际例子:什么是网络爬虫?通用爬虫和聚焦爬虫基本上可以用大多数语言编写爬虫,但是python有其独特的优势。网络请求urlopen函数使用
urllib 库是python中最基本的网络请求库。可以模仿浏览器的行为,向指定的服务器发送请求,可以保存服务器返回的数据。
在 Python3 的 urllib 库中,所有与网络请求相关的方法都集成在 urllib.request 模块下。栗子的基本用途:
from urllib import request
resp = request.urlopen("http://www.baidu.com")
print(resp.read())
其实如果你用浏览器访问百度,右击查看源码,你会发现和上面打印的数据是一样的。也就是说,上面三行代码已经帮我把百度首页的代码全部爬下来了。
urlopen函数详细介绍:
url: 请求的url
data: 请求的data,如果设置了这个值,那么将变成post请求。
返回值: 返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、 readline、 readlines以及getcode等方法。
getcode 是获取当前响应的状态码。
Urlretrieve 函数用法
此功能可以方便地将网页上的文件保存到本地。以下代码可以方便的将百度主页下载到本地:
from urllib import request
request.urlretrieve('http://www.baidu.com/','baidu.html')
这是抓取的百度页面
还可以爬图
随便找一张图片,复制它的地址,然后修改参数就可以爬取了
这是鲁班的图片,成功爬下来。
参数解码和解码功能
urlencode 函数
使用浏览器发送请求时,如果 URL 中收录
中文或其他特殊字符,浏览器会自动对其进行编码。如果您使用代码发送请求,则必须手动对其进行编码。这时候就应该使用urlencode函数来实现了。urlencode 可以将字典数据转换为 URL 编码的数据。示例代码如下
from urllib import parse
data = {
'name':'m0re',"age":18,'great':'hello,world'}
j4y = parse.urlencode(data)
print(j4y)
结果:
name=m0re&age=18&great=hello%2Cworld
还可以
parse_qs 函数可以对 urlencode 函数编码的字符串进行解码
如下
urlparse 和 urlsplit
有时候你拿到一个网址,想要拆分网址的各个组成部分,那么可以使用 urlparse 或者 urlsplit 来拆分。示例代码如下:
#encoding: utf-8
from urllib import request,parse
url = 'http://www.baidu.com/s?username=zhiliao'
result = parse.urlsplit(url)
print('scheme',result.scheme)
print('netloc',result.netloc)
print('path',result.path)
print('query',result.query)
Urlparse 和 urlsplit 基本相同。唯一的区别是urlparse中多了一个params属性,而urlsplit没有这个属性。例如,如果有一个 URL;hello?wd=python&username=abc#1,那么urlparse可以获取hello,urlsplit却获取不到。但是URL中的params也用的比较少。
请求类
如果要在请求时添加一些请求头,必须使用 request.Request 类来实现。比如添加一个User-Agent,示例代码
#encoding: utf-8
from urllib import request
url = 'https://www.xxxxxx.com/zhaopin/Python/?labelWords=label'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
req = request.Request(url,headers=headers)
resp = request.urlopen(req)
print(resp.readlines())
可见也可以爬取
那么我们要记住,如果不添加User-Agent,爬虫在爬取时是得不到有用信息的。您可以尝试删除上面代码中的用户代理。如果您不添加 User-Agent,那将很容易。识别爬虫,然后拒绝爬取有用的信息。
当时有些信息只能通过爬取js代码来获取。例如,抓取某网站的招聘信息。
首先找到需要爬取的网站的如下信息:
首先找到信息所在的网页,查看请求的URL和请求方式
第二个是数据
写在代码中,模仿浏览器访问网页,达到爬取信息的目的
#encoding: utf-8
from urllib import request,parse
#url = 'https://www.xxxxx.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
#resp = request.urlopen(url)
#print(resp.read())
url = 'https://www.xxxxxx.com/jobs/positionAjax.json?px=default&city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36' }
data = {
'first': 'true',
'pn': 1,
'kd': 'python'
}
req = request.Request(url, headers=headers, data=parse.urlencode(data).encode('utf-8'), method='POST')
resp = request.urlopen(req)
print(resp.read())
爬取某招聘网站的职位信息。这是一个初步的模型,但无法抓取任何信息。因为目前大部分网站都有反爬虫机制,所以报这样的错误。事实上,这不是一个错误。是浏览器返回的信息。
b'{"status":false,"msg":"\xe6\x82\xa8\xe6\x93\x8d\xe4\xbd\x9c\xe5\xa4\xaa\xe9\xa2\x91\xe7\xb9\x81,\xe8\xaf\xb7\xe7\xa8\x8d\xe5\x90\x8e\xe5\x86\x8d\xe8\xae\xbf\xe9\x97\xae","clientIp":"42.226.97.244","state":2402}\n'
这是 URL 编码的。如果你解码它,它太频繁了。让我们稍后访问它。但是回到浏览器访问完全没有问题。
原因是抗爬虫机制的作用。我的爬虫还是很容易查出来的,需要模仿的还是比较像的。添加Referer(也到浏览器的开发者界面找)
部分网站反爬虫机制比较强,添加Referer后可能无法抓取有用信息。
需要深度学习添加其他验证身份的条件,比如下面要学习的Cookie。
ProxyHandler 处理器(代理设置)
很多网站都会检测一定时间段内某个IP的访问次数(通过流量统计、系统日志等)。如果访问次数不像正常人那样,就会禁止访问这个IP。所以解决办法是设置一些代理服务器,每隔一段时间就换一个代理。即使IP地址被禁止,您仍然可以更改IP继续抓取。
ProxyHandler 用于在 urllib 中设置代理服务器。
前提:
#encoding: utf-8
from urllib import request
url = "http://httpbin.org/ip"
# 传入代理
handler = request.ProxyHandler({
"http":"49.70.89.14:9999"})
# 使用上面创建的handler构建一个opener
opener = request.build_opener(handler)
# 使用opener去发送一个请求
resp = opener.open(url)
print(resp.read())
注意:
代理需要自己设置一个有用的代理。我只是一个免费的人。我现在可以做到。不知道明天能不能用 而已。
然后各种报错,emmm,代码没问题,是配置问题
错误一:
urllib.error.URLError:
这与请求的 URL 相关。解决办法是把请求的URL改成双引号就OK了。(以上代码已修改)
错误二:
urllib.error.URLError:
这个百度有的,但是有的因为电脑配置无法解决。
可以参考
配置问题,我就不赘述了。
这里介绍几个常用的代理,如果需要更多请百度。
常用的代理有:
cookie模拟登录
在浏览器中找到cookie并添加到爬虫脚本中。
添加到标题,然后爬行。
以人人网为例。在人人网中,访问用户主页浏览信息需要登录,即需要cookie信息。如果想通过代码访问,需要正确的cookie信息才能访问。解决方法有两种:第一种是使用浏览器访问,然后将cookie信息复制到headers中。(没有账号,懒得注册) 缺点是每次访问都需要从浏览器复制cookie,比较麻烦。Python中处理cookies一般与http.cookiejar模块和urllib模块的HTTPCookieProcessor处理器类一起使用。http.cookiejar 模块的作用是提供存储cookies的对象。
爬虫自动登录访问授权页面