爬虫学习笔记(1)

 网络爬虫规则

我用的操作系统ubuntu + pycharm + anaconda

在网上搜教程即可安装好,利用conda下载 requests 库,在pycharm 中配置anaconda 作为编译器环境即可

#requests库7个主要方法:
a、requests.request() 构造一个请求,支撑以下各方法的基础方法
b、requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
c、requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
d、requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST
e、requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
f、requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH
g、requests.delete() 向HTML页面提交删除请求,对应于HTTP的DELETE

r = requests.get(url)    
        r是返回一个包含服务器资源的Response对象,右边是构造一个向服务器请求资源的Request对象
requests.get(url,params=None,**kwargs)  完整格式
    params:url中的额外参数,字典或者字节流格式可选
    **kwargs:12个控制访问参数可选
打开源码可知,get方法是调用requests方法封装的,实际上7个方法中,其余6个都是由request方法封装
Response对象常用5个属性
    r.status_code HTTP请求的返回状态,200表示连接成功,404表示失败
    r.text HTTP响应内容的字符串形式,即,url对应的页面内容
    r.encoding 从HTTP header中猜测的响应内容编码方式,如果header中不存在charset,则认为编码为ISO-8859-1
    r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)
    r.content HTTP响应内容的二进制形式
requests库异常
  requests.ConnectionError 网络连接错误异常,如DNS查询失败、拒绝连接等
    requests.HTTPError HTTP错误异常
    requests.URLRequired URL缺失异常
    requests.TooManyRedirects 超过最大重定向次数,产生重定向异常
    requests.ConnectTimeout 连接远程服务器超时异常
    requests.Timeout 请求URL超时,产生超时异常
爬取网页的通用代码框架

import requests
def getHTMLText(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(getHTMLText(url))

 

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

通过URL和命令管理资源,操作独立无状态,网络通道及服务器成为了黑盒子

理解PATCH和PUT的区别:
假设URL位置有一组数据UserInfo,包括UserID、UserName等20个字段
需求:用户修改了UserName,其他不变
. 采用PATCH,仅向URL提交UserName的局部更新请求
. 采用PUT,必须将所有20个字段一并提交到URL,未提交字段被删除
PATCH的最主要好处:节省网络带宽

http协议与requests库功能是一致的

requests.request()
requests.request(method, url, **kwargs)
method : 请求方式,对应get/put/post等7种
∙ url : 拟获取页面的url链接
∙ **kwargs: 控制访问的参数,共13个

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)

**kwargs: 控制访问的参数,均为可选项
params : 字典或字节序列,作为参数增加到url中
data : 字典、字节序列或文件对象,作为Request的内容
json : JSON格式的数据,作为Request的内容
headers : 字典,HTTP定制头
cookies : 字典或CookieJar,Request中的cookie
auth : 元组,支持HTTP认证功能
files : 字典类型,传输文件
timeout : 设定超时时间,秒为单位
proxies : 字典类型,设定访问代理服务器,可以增加登录认证
allow_redirects : True/False,默认为True,重定向开关
stream : True/False,默认为True,获取内容立即下载开关
verify : True/False,默认为True,认证SSL证书开关
cert : 本地SSL证书路径

2. robots.txt 网络爬虫排除标准

小规模,数据量小,爬取速度不敏感,Requests库 , 90%以上   ,   爬取网页 玩转网页
中规模,数据规模较大,爬取速度敏感,Scrapy库 ,爬取网站 爬取系列网站
大规模,搜索引擎爬取,速度关键 ,定制开发,爬取全网

限制网络爬虫:1.来源审查 2.robots协议

3.实例:京东商品链接

import requests
url = 'https://item.jd.com/100004404944.html'
try:
	r = requests.get(url, timeout=30)
	r.raise_for_status()
    #如果状态不是200,引发httperror异常
	r.encoding = r.apparent_encoding
	print(r.text[:1000])
except:
	print("产生异常")

亚马逊商品(修改头部)

import requests
r = requests.get('https://www.amazon.cn/dp/B07TYR42LV')
print(r.status_code) # 网络没错,浏览器判断不同。
print(r.encoding)
print(r.request.headers) # 头部信息

kv = {'user-agent':'Chrome/5.0'}
url = 'https://www.amazon.cn/dp/B07TYR42LV'
r = requests.get(url, headers = kv)
print(r.status_code)
print(r.request.headers)
page = r.text
print(page)

baidu 360 搜索关键词提交

http://www.baidu.com/s?wd=keyword

http://www.so.com/s?q=keyword

import requests
arg='wd'
keyword='Python'
try:
    kv={arg:keyword}
    r = requests.get('http://www.baidu.com/s',params = kv)
    r.raise_for_status()
    print(r.status_code)
    print(r.request.url)
    print(len(r.text))
except:
    print("spider failed")

 

网络图片的爬取(下载图片)

格式:http://www.exp.com/pic.jpg

国家地理:http://www.ngchina.com.cn/

import requests
import os
url = "http://image.ngchina.com.cn/2019/1026/20191026093445665.jpg"
root = "E://kaifa//pics//"
path = root + url.split('/')[-1]
try:
    # 当前根目录是否存在
    if not os.path.exists(root):
        os.mkdir(root)
    print(path)
    # 当前文件是否存在
    if not os.path.exists(path):
        r = requests.get(url)
        r.raise_for_status()
        print(r.status_code)
        with open(path,'wb') as f:
            f.write(r.content)
            f.close()
    else:
        print("file exists!")
except:
    print("spider failed")

IP地址归属地自动查询

import requests
url = "http://m.ip138.com/ip.asp?ip="
try:
    r = requests.get(url + '202.204.80.112')
    r.raise_for_status()
    print(r.status_code)
    r.encoding = r.apparent_encoding
    print(r.text[-500:])
except:
    print("spider failed")

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值