Python爬虫系列1(入门超详细)

网络爬虫概述

此章节是关于爬虫的一些基础知识,可以仔细阅读实操一下,为之后打下基础
学习爬虫,首先我们要了解爬虫是什么

定义

网络蜘蛛、网络机器人、爬取网络的数据的程序
其实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方法

1bytes=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
6bytes.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()

  • 113
    点赞
  • 467
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值