python爬虫学习笔记(一)——requests库

一.HTTP基本原理

1.URL和URI

URL是URI的子集,URI还包括URN,在互联网中,我们一般的网页链接可以被称为URL或者URI,大多数人称为URL。

2.超文本

我们平常在网站浏览的网页就是超文本解析而成的,这些源代码是一系列的HTML代码,如img:显示图片,p:指定显示段落等。HTML可以被称为超文本。

3.http和https

HTTP,Hypertext Transfer Protocol,超文本传输协议

HTTP是一个基于“请求与响应”模式的、无状态的应用层协议

HTTP协议采用URL作为定位网络资源的标识

URL格式 http://host[:port][path]

host:合法的Internet主机域名或IP地址

port:端口号,缺省端口为80

path:请求资源的路径

URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源
http:

  • 超文本传输协议
  • 默认端口:80

https:

  • HTTP+SSL(安全套接字层)
  • 默认端口:443

https比http更加安全但是性能更低

二.爬虫的基本原理

1.分类:根据使用场景,爬虫可以分为两类

通用爬虫:是搜索引擎抓取系统的重要组成部分

聚焦爬虫:面向特点网页的一种网络爬虫程序

2.爬虫的原理:

网页请求过程分为两个环节

1.request(请求):向服务器发送访问请求

2.response(响应):服务器接收到用户的请求后,验证请求的有效性,然后向用户发送响应的内容

网页请求的方式有两种:

1.GET:最常见的方式,一般用于获取或查询资源信息,响应速度快。

2.POST:相比GET方式,还可以进行修改信息

三.requests库

1.requests库的安装:我自己使用的是pycharm,所以我直接在里面搜索安装即可。

2.requests库的使用:

获取网页:r=requests.get(url)

状态码:r.status_code,200是访问成功

编码:r.encoding='utf-8'

网页内容:r.text
requests库的7个常用方法:

requuests.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

3.requests库的get()方法

r.requests.get(url) 构造一个向服务器请求资源的requests对象,返回一个包含服务器资源的requests对象

requests.get(url,params=None,**kwarge)

url:获取页面的url链接

params:url中的额外参数,字典或字节流格式

**kwargs:12个控制访问的参数
requests对象的属性

r.status_code	 HTTP请求的返回状态,200表示连接成功,404表示失败
r.text	HTTP响应内容的字符串形式,即 url对应的页面内容
r.encoding	从HTTP header中猜测的响应内容编码方式
r.apparent_encoding	从内容中分析出的响应内容编码方式(备选编码方式)
r.content	 HTTP响应内容的二进制形
r.encoding: 如果header中不存在charset,则认为编码为ISO­8859­1 

4.爬取网页的通用代码框架:

import requests
def gethttptext(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()#如果状态不是200,引发httperror异常
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return '产生异常'
if __name__=="__main__":
    url="http://www.baidu.com"
    print(gethttptext(url))
Python

5.网络爬虫的限制:

来源审查:判断User­Agent进行限制

检查来访HTTP协议头的User­Agent域,只响应浏览器或友好爬虫的访问
发布公告:Robots协议

告知所有爬虫网站的爬取策略,要求爬虫遵守
Robots协议

Robots Exclusion Standard 网络爬虫排除标准

作用:网站告知网络爬虫哪些页面可以抓取,哪些不行

形式:在网站根目录下的robots.txt文件

Robots协议基本语法: https://www.jd.com/robots.txt

User-agent: * # 注释:

Disallow: /?* *代表所有

Disallow: /pop/*.html /代表根目录
Robots协议的遵守方式

网络爬虫使用Robots协议:自动或人工识别robots.txt,再进行内容爬取

约束性:Robots协议是建议但非约束性,网络爬虫可以不遵守,但存在法律风险

四.Requests库爬取实例

实例1:京东商品页面的爬取

import requests
def httpjdtext(url):
    try:
        r=requests.get(url)
        r.raise_for_status()#如果状态不是200,则报错
        r.encoding=r.apparent_encoding
        return (r.text[:1000])
    except:
        print("爬取失败")
if __name__=="__main__":
    print(httpjdtext('https://item.jd.com/100004770249.html'))
Python

实例2:亚马逊商品页面的爬取

import requests
def httpymxtext(url):
    try:
        kv={'user-agent':'Mozilla/5.0'}
        r=requests.get(url,headers=kv)#通过headers模拟浏览器爬取信息
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return (r.text[1000:2000])
    except:
        print("爬取失败")
if __name__=="__main__":
    url=input()
    print(httpymxtext(url))
Python

实例3:百度360搜索关键词提交

import requests
keyword='Python'
try:
    kv={'wd':keyword}
    r=requests.get('http://www.baidu.com/s',params=kv)
    print(r.request.url)
    r.raise_for_status()
    print(len(r.text))
except:
    print('爬取失败')
Python

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

'''
import requests
path="D:/abc.jpg"
url="http://img0.dili360.com/ga/M00/48/F7/wKgBy1llvmCAAQOVADC36j6n9bw622.tub.jpg"
r=requests.get(url)
print(r.status_code)
with open(path,'wb') as f:
    f.write(r.content)
f.close()
'''
import requests
import os
def httpimg(url):
    root='E://py项目//'
    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)
            r.raise_for_status()
            with open(path,'wb') as f:
                f.write(r.content)
                f.close()
                print('文件保存成功')
        else:
            print('文件已存在')
    except:
        print('爬取失败')
if __name__=="__main__":
    url=input()
    print(httpimg(url))
Python

实例5:IP地址归属地的自动查询

import requests
def httpid(url):
    try:
        kv={'user-agent':'Mozilla/5.0'}
        r=requests.get(url,headers=kv)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return (r.text[1000:2000])
    except:
        print("爬取失败")
if __name__=="__main__":
    a=input()
    url='https://m.ip138.com/iplookup.asp?ip='+a
    print(httpid(url))

你可能感兴趣的:(python爬虫,python,python)