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

py爬虫笔记

一.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))

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'))

实例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))

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

实例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))

实例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))

点赞
  1. 逆转粉碎机说道:
    Google Chrome Windows 10

    大佬,请问这个IP地址归属地的自动查询里面的查询接口https://m.ip138.com/iplookup.asp?ip=是怎么得到的呢?和嵩天老师讲的不一样

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像