网络爬虫概述
此章节是关于爬虫的一些基础知识,可以仔细阅读实操一下,为之后打下基础
学习爬虫,首先我们要了解爬虫是什么
定义
网络蜘蛛、网络机器人、爬取网络的数据的程序
其实Python爬虫就是模仿人点击浏览器并访问,而且模仿的越像越好,让web站点无法发现你是不是人。
话不多说 我们直接开始操作
首先,我们先开始一个最简单的网络爬虫,学习该爬虫,首先你要有一定的编程基础,如果没有一些编程基础的话,对于一些概念的理解可能有点难,我所使用的工具是 pycharm和Python3.7,关于这两样的安装我就不一一概述了
python 下载地址添加链接描述
PyCharm:添加链接描述
关于环境变量配置以及其他的 大家网上去找相关教程 都不复杂
爬虫的爬取数据的步骤
1.确定需要爬取的url地址
2.由请求模块向url发起请求,并得到网站回应
3.从相应内容中提取数据:
1.所需数据保存
2.页面中有其他跟进的url,继续第二步去发起请求,如此循环。
第一个爬虫
创建一个Python文件输入一下代码就完成了一个最简单的爬虫,下面我们来详细介绍一下
import urllib.request
# urlopen()向url发送请求返回对象
response = urllib.request.urlopen('http://www.baidu.com/')
# 提取响应内容
html = response.read().decode('utf-8')
# 打印响应内容
print(html)
如果你使用pycharm成功运行了此代码,就可以在控制台得到以下的结果,是百度首页的html,我们所看到的网页,本质上也是由一行行代码所构成的,而爬虫就是从这些代码中,提取我们所需的数据
常用方法详解
在Python2版本中,有urllib和urlib2两个库可以用来实现request的发送。而在Python3中,已经不存在urllib2这个库了,统一为urllib。Python3 urllib库官方链接添加链接描述
urllib.request.urlopen()基本使用
作用
向网站发起请求并获得响应对象
urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还带有处理 authenticaton (授权验证), redirections (重定向), cookies (浏览器Cookies)以及其它内容。
参数
1.url需要爬取的地址‘。
2.timeout设置等到超时时间,指定时间未得到响应抛出异常。
,在这里我们要知道urllib.request.urlopen可以使我们程序向浏览器发送一个请求,同时返回一个对象,我们可以接受这个对象,并保存下来进行一些处理,话不多说,接着往下走
*响应对象response方法
1、bytes=response.read() #read的得到结果类型为bytes
2、strings=response.read().decode()
#decode()转换为string数据类型
3、url=response.geturl()#返回实际类型的url地址
4、response.getcode() #返回http响应的状态码
补充
5、string.encode() bytes->string
6、bytes.decode() string->bytes
reponse对响应结果做一些处理得到我们想要的
网站如何判断是人类正常访问还是爬虫访问
我们这里思考一个问题,我们直接访问网站和用爬虫有什么区别???网站如何识别
在此做个说明,我们请求网站都会带着一系列信息,其中请求头User-Agent就是网站识别我们的信息
直接在浏览器访问此url
http://httpbin.org/get 发请求-查看自己的请求头 -响应内容
我们得到可以这样一个结果,我用的谷歌
其中 我们可以找到我们正常访问网站的请求头是这样的,每个浏览器都不一样
我们再看用Python程序访问
from urllib import request
url = 'http://httpbin.org/get'
res = request.urlopen(url)
print(res.read().decode())
通过运行代码得到一下结果
可以看到我们的请求头userAgent!!与正常访问完全不同
"User-Agent": "Python-urllib/3.7",
这个请求头很容易就被网站识别出来,因此我们需要对请求头做一些包装,以突破一些反爬
重构userAgent
发请求需要带着请求头过去,单是urllib.request.urlopen不支持重构请求头,因此我们需要以下方法
urllib.request.Request
- 作用
创建请求对象(包装请求,重构userAgent,使程序更像是人类请求)
- 参数
1、url 请求地址
2、headers 添加请求头(爬虫和反爬虫第一步)
- 使用流程
1、构造请求对象(重构userAgent)
2、发送请求获取响应对象(urlopen)
3、获取响应对象内容
首先,重构userAgent我们需要得到一个正常的userAgent
在这里可以百度userAgent大全
从其中获取一个自己需要的
构造请求对象
1重构useragent
req=urllib.request.Request(url,headers={'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'})
2、发送请求获取响应对象(urlopen)
res = urllib.request.urlopen(req)
3、获取响应内容
html = res.read().decode()
整理一下 完整的代码如下
import urllib
from urllib import request
# 定义常用变量
url = 'http://httpbin.org/get'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) '
'Chrome/14.0.835.163 Safari/535.1'}
# 重构useragent
req = urllib.request.Request(url=url, headers=headers)
# 发送请求获取响应对象(urlopen)
res = urllib.request.urlopen(req)
# 获取响应内容
html = res.read().decode()
print(html)
运行程序得到以下结果,我们可以看到userAgent已经成功重构
url编码模块
随便在百度搜索一个东西,如图,url
都有长长的一串,我们把它截取下来是这样的,
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=40020637_10_oem_dg&
wd=%E8%8B%B9%E6%9E%9C //这个就是wd=苹果,因为粘贴过来进行了自动编码,所以变成这个样子
&fenlei=256&oq=useragent%25E5%25A4%25A7%25E5%2585%25A8&rsv_pq=a6f5b4f2000a860d&rsv_t=3cf6cpHgEMwa%2FvyFVchn1lnN%2Bg1Re46q52JvYyi0CFoBJX%2F0V3oFVQ5O2Apco%2FxekopzrUtW%2FHh7&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_btype=t&inputT=4941&rsv_sug3=10&rsv_sug1=8&rsv_sug7=101&rsv_sug2=0&rsv_sug4=4941
现在我们做一些简化
去除多余的,只留下百度url和我们搜索的关键字,再直接输入这个url得到相同的结果
https://www.baidu.com/s?wd=%E8%8B%B9%E6%9E%9C
其实url中其余的都是非必须的,用来记录你的访问以及一些其他信息,因为汉字需要通过编码才能被程序识别,在这里有很多的urlencode在线编码,百度一下就可以得到,将汉字转化为编码
编码我们需要新的方法
#模块
urllib.parse
#导入
import urllib.parse
from urllib import parse
作用
给url查询参数进行编码
编码前 https://www.baidu.com/s?wd=苹果
编码后 https://www.baidu.com/s?wd=%E8%8B%B9%E6%9E%9C
常用参数
url查询一个参数
# 查询参数{‘wd’:'苹果'}
#urlencode编码后 'wd=%E8%8B%B9%E6%9E%9C'
#示例代码
query_string={‘wd’:'苹果'}
result=urllib.parse.urlencode(query_string)
#result='wd=%E8%8B%B9%E6%9E%9C'
url查询多个参数
#其中pn=10代表百度结果的第二页,可以自己去百度查看
param={'wd':'苹果','pn':'10'}
result=urllib.parse.urlencode(param)
#result='wd=%E8%8B%B9%E6%9E%9C&pn=10'
上代码
from urllib import parse
param={'wd':'苹果','pn':'10'}
result=parse.urlencode(param)
url='https://www.baidu.com/s?{}'.format(result)
print(url)
可以得到结果
访问这个url可以得到苹果搜索的第二页
拼接url的三种方式
#1、字符串相加
baseurl='https://www.baidu.com/s?'
param='wd=%E8%8B%B9%E6%9E%9C&pn=10'
url=baseurl+param
#2字符串占位符
params='wd=%E8%8B%B9%E6%9E%9C&pn=10'
url='https://www.baidu.com/s%s?'%params
#3format
url='https://www.baidu.com/s{}?'
param='wd=%E8%8B%B9%E6%9E%9C&pn=10'
url=url.formate(param)
下面来一个实例,获取百度苹果界面
from urllib import parse
from urllib import request
# 1拼接地址参数
def get_url(word):
baseurl = 'https://www.baidu.com/s?'
param = parse.urlencode({'wd': word})
url = baseurl + param
return url
# 2请求+保存
def write_html(url, word):
# 拿到响应内容
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) '
'Chrome/14.0.835.163 Safari/535.1'}
req = request.Request(url=url, headers=headers)
res = request.urlopen(req)
html = res.read().decode()
# 保存到本地
filename = word + '.html'
# 这里需要注意encoding在linux系统可以不加 但是Windows必须加 不然无法识别
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
# 主程序入口
if __name__ == '__main__':
word = input('请输入搜索内容')
url = get_url(word)
write_html(url, word)
运行结果如图
我们得到一个苹果.html文件
关于编码说明一下 Windows默认的是GBK所以对应汉字识别不太好在此之上还有gbk2312 gbk18030 utf-8范围依次增大
utf-8是最强大的 建议使用这个
queto(string)编码
实例
from urllib import parse
string = '苹果'
print(parse.quote(string))
# 输出 %E8%8B%B9%E6%9E%9C与urlencode效果相同
将上面那个改为queto
from urllib import parse
from urllib import request
# 1拼接地址参数
def get_url(word):
baseurl = 'https://www.baidu.com/s?'
params = parse.quote( word)
param='wd='+params
url = baseurl + param
return url
# 2请求+保存
def write_html(url, word):
# 拿到响应内容
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) '
'Chrome/14.0.835.163 Safari/535.1'}
req = request.Request(url=url, headers=headers)
res = request.urlopen(req)
html = res.read().decode()
# 保存到本地
filename = word + '.html'
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
# 主程序入口
if __name__ == '__main__':
word = input('请输入搜索内容')
url = get_url(word)
write_html(url, word)
还有一个用于解码的 unquote
from urllib import parse
string = parse.unquote('%E8%8B%B9%E6%9E%9C')
print(string)
#得到结果苹果
总结
1、urllib.request
req=request.Request(url=url,headers=headers)
res=request.urlopen(req)
html=res.read().decode()
#响应对象方法
res.read()
res.getcode()
res.geturl()
#urllib.parse
parse.urlencode({})
parse.quote()
parse.unquote()