Python旅途遇到游乐园——爬虫入门 ( 一 )

我真的很想告诉你们我停更的那一天发生了什么

刚来的朋友们可以根据上面的这篇日常,给自己的Python装上Requests模块
之后我们就可以开开心心进入Python爬虫游乐园玩耍啦

简而言之:爬虫入门,首先就要在自己的Python上安装Requests模块
上面的日常记录了我这个憨憨安装Requests模块时的憨批操作,当然也有一些非常有用的安装指南链接,大家加油盘ta!


Requests库的get()方法

get是Requests库里一个非常非常重要的方法
获得一个网页最简单的方法就是:

r = requests.get(url)

我们通过这行代码,构造了一个向服务器请求资源的 R e q u e s t s 对 象 Requests对象 Requests(Python对大小写敏感,所以Requests对象要保持大写)
get()返回了一个包含服务器资源的 R e s p o n s e 对 象 Response对象 Response,包含从服务器返回的所有相关资源

get()函数原型
requests.get(url,params=None,**kwargs)
  • url:拟获取页面的url链接
  • params:url中的额外参数,字典或字节流格式,可选
  • **kwargs:12个控制访问的参数

用help偷偷查看一下get的用法并且假装自己看的懂得亚子:

>>> help(requests.get)
Help on function get in module requests.api:

get(url, params=None, **kwargs)
    Sends a GET request.
    
    :param url: URL for the new :class:`Request` object.
    :param params: (optional) Dictionary, list of tuples or bytes to send
        in the query string for the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response

下面我们就举一个小小的栗子:

import requests
url = 'https://www.bilibili.com/'
r = requests.get(url)
print(r.status_code)

##################################
200
# 输出200表示获取成功
>>> type(r)
<class 'requests.models.Response'>

栗子里得 r r r就是一个 R e s p o n s e 对 象 Response对象 Response
R e s p o n s e 对 象 Response对象 Response的常用属性:

属性说明
r.status_codeHTTP请求的返回状态,200表示连接成功,404表示失败
r.textHTTP相应内容的字符串形式,即url对应的页面内容
r.encoding从HTTP header中猜测的响应内容编码方式
r.apparent_encoding从内容中分析出的响应内容编码方式(备选编码方式)
r.contentHTTP响应内容的二进制形式

在这里插入图片描述


爬取网页的通用代码框架

Requests库的异常:

异常说明
requests.ConnectionError网络连接错误异常,如DNS查询失败,拒绝连接等
requests.HTTPErrorHTTP错误异常
requests.URLRequiredURL缺失异常
requests.TooManyRedirects超过最大重定向次数,产生重定向异常
requests.ConnectTimeout连接远程服务器超时异常
requests.Timeout请求URL超时,产生超市异常

理解Requests库的异常:

异常说明
r.raise_for_status()如果不是200,产生异常requests.HTTPError

下面我们就利用上述针对异常的操作,给出爬取网页的通用代码框架(可以自己运行一下):

import requests
def getHTMLText(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status()
        # 如果状态不是200,引发HTTPError异常
        r.encoding = r.apparent_encoding
        # 用apparent_enconding代替encoding,使返回异常的解码是正确的
        return r.text
    except:
        return "产生异常"

if __name__=='__main__':
    url = 'http://www.baidu.com'
    print(getHTMLText(url))

Requests库的方法

Requests库常见的七种方法:

方法说明
requests.request()构造一个请求,支持以下挨个方法的基础方法
requests.get()获取HTML网页的主要方法,对应于HTTP的GET
requests.head()获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.post()向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.put()向HTML网页提交PUT请求方法,对应于HTTP的PUT
requests.patch()向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete()向HTML页面提交删除请求,对应于HTTP的DELETE

这里我们有必要介绍一下HTTP协议:

HTTP协议:
HTTP,Hypertext Transfer Protocol,超文本传输协议
HTTP是一个基于“请求与响应”模式的,无状态的应用层协议
HTTP协议采用URL作为定位网络资源的标识

URL格式
h t t p : / / h o s t [ : p o r t ] [ p a t h ] http://host[:port][path] http://host[:port][path]

  • host:合法的Internet主机域名或IP地址
  • port:端口号,缺省端口为80
  • path:请求资源的路径

HTTP协议对资源的操作

方法说明
GET请求获取URL位置的资源
HEAD请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
POST请求向URL位置的资源后附加新的数据
PUT请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE请求删除URL位置存储的资源

r e q u e s t s . r e q u e s t requests.request requests.request
requests.request(method,url,**kwargs)
  • method:请求方式
r = requests.request('GET',url,**kwargs)
r = requests.request('HEAD',url,**kwargs)
r = requests.request('POST',url,**kwargs)
r = requests.request('PUT',url,**kwargs)
r = requests.request('PATCH',url,**kwargs)
r = requests.request('DELETE',url,**kwargs)
r = requests.request('OPTIONS',url,**kwargs)
  • url:拟获取页面的url链接
  • **kwargs:13个控制访问的参数,可选
  1. params:字典或字节序列,作为参数增加到url中
import requests

kv = {'kay1':'value1','kay2':'value2'}
r = requests.request('GET','http://python123.io/ws',params=kv)
print(r.url)

# 把键值对增加到url中
https://python123.io/ws?kay1=value1&kay2=value2

键值对是Python字典里的概念,客官这边请

  1. data:字典,字节序列或文件对象,作为Request的内容
kv = {'key1':'value1','key2':'value2'}
r = requests.request('POST','http://python123.io/ws',data=kv)
  1. json:JSON格式的数据,作为Request的内容
  2. headers:字典,HTTP定制头
  3. cookies:字典或CookieJar,Request中的cookie
  4. auth:元组,支持HTTP认真功能
  5. files:字典类型,传输文件
fs = {'file' : open('data.xls','rb')}
r = reuqests.request('POST','http://python123.io/ws',file=fs)
  1. timeout:设定超过时间,秒为单位
r = requests.request('GET','http://www.baidu.com',timeout=10)
  1. proxies:字典类型,设定访问代理服务器,可以增加登录认证
pxs = {'http':'http://user:pass@10.10.10.1:1234',
       'https':'https://10.10.10.1:4321'}
r = requests.request('GET','http://www.baidu.com',proxies=pxs)
  1. allow_redirects:True/False,默认为True,重定向开关
  2. stream:True/False,默认为True,获取内容立即下载开关
  3. verify:True/False,默认为True,认证SSL证书开关
  4. cert:本地SSL证书路径

r e q u e s t s . g e t requests.get requests.get
requests.get(url,params=None,**kwargs)
  • url:拟获取页面的url链接
  • params:url中的额外参数,字典或字节流格式,可选
  • **kwargs:12个控制访问的参数,可选

r e q u e s t s . h e a d requests.head requests.head
requests.head(url,**kwargs)
  • url:拟获取页面的url链接
  • **kwargs:13个控制访问的参数,可选(与request一样)

r e q u e s t s . p o s t requests.post requests.post
requests.post(url,data=None,json=None,**kwargs)
  • url:拟获取页面的url链接
  • data:字典,字节序列或文件,Request的内容
  • json:JSON格式的数据,Request的内容
  • **kwargs:11个控制访问的参数,可选

r e q u e s t s . p u t requests.put requests.put
requests.put(url,data=None,**kwargs)
  • url:拟获取页面的url链接
  • data:字典,字节序列或文件,Request的内容
  • **kwargs:12个控制访问的参数,可选

r e q u e s t s . p a t c h requests.patch requests.patch
requests.patch(url,data=None,**kwargs)
  • url:拟获取页面的url链接
  • data:字典,字节序列或文件,Request的内容
  • **kwargs:12个控制访问的参数,可选

r e q u e s t s . d e l e t e requests.delete requests.delete
requests.delete(url,**kwargs)
  • url:拟获取页面的url链接
  • **kwargs:13个控制访问的参数,可选

Robots协议

Robots Exclusion Standard 网络爬虫排除标准
作用: 网站告知爬虫哪些内容可以抓取,那些不行
形式: 在网站根目录下的robots.txt

Robots协议基本语法:
# 注释
* 代表所有
/ 代表根目录

User-agent: *
Disallow: /

讲真我去访问了一些知名网站的robots协议,感觉非常神奇(可能程序员定义中的 " 神奇 " 比较诡谲)

http://www.baidu.com/robots.txt
http://news.sina.com.cn/robots.txt
http://www.qq.com/robots.txt
http://news.qq.com/robots.txt

对于任何一个合格的网络爬虫,都应该自动或人工识别robots.txt,再进行内容爬取


实例一:京东商品页面爬取

我要爬取我一直很想要的这个花京院典明的同款耳钉!

import requests
url = 'https://item.jd.com/55159887218.html'
r = requests.get(url)

>>> r.status_code
200
>>> r.encoding
'gbk'

完整代码(用分片的格式输出前999个字符,看懂了吗)

import requests

url = 'https://item.jd.com/55159887218.html'
try:
    r = requests.get(url)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[:1000])
except:
    print('爬取失败')

实例二:网络图片的爬取和存储

网络图片链接的一般格式:
h t t p : / / w w w . e x a m p l e . c o m / p i c t u r e . j p g http://www.example.com/picture.jpg http://www.example.com/picture.jpg

试了试爬取大大个人网站上的图片,成功啦!

import requests
import os

url = 'http://images.uchor.com/o_1aa70i5ee18mduagc311fri22g14.jpg?imageMogr2/quality/99|watermark/1/image/aHR0cDovL2ltYWdlcy51Y2hvci5jb20vd2F0ZXJtYXJrLnBuZw==/gravity/South/dx/0'
root = 'D://pic//'
path = root + url.split('/')[-1]
try:
    if not os.path.exists(root):
        os.mkdir(root)
    if not os.path.exists(path):
        r = requests.get(url)
        with open(path,'wb') as f:
            f.write(r.content)
            f.close()
            print('文件保存成功')
    else:
        print('文件已存在')
except:
    print('爬取失败')

在这里插入图片描述

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值