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对象 (Python对大小写敏感,所以Requests对象要保持大写)
get()返回了一个包含服务器资源的 R e s p o n s e 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 e s p o n s e Response对象
R e s p o n s e Response对象 的常用属性:

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

在这里插入图片描述


爬取网页的通用代码框架

requests库的异常:

异常 说明
requests.ConnectionError 网络连接错误异常,如DNS查询失败,拒绝连接等
requests.HTTPError HTTP错误异常
requests.URLRequired URL缺失异常
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]

  • 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(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:网页地址
  • **kwargs:控制访问的参数,可选
    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字典里的概念,客官这边请


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

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

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('爬取失败')

在这里插入图片描述

发布了953 篇原创文章 · 获赞 205 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/wu_tongtong/article/details/104374146