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:
https:
https比http更加安全但是性能更低
1.分类:根据使用场景,爬虫可以分为两类
通用爬虫:是搜索引擎抓取系统的重要组成部分
聚焦爬虫:面向特点网页的一种网络爬虫程序
2.爬虫的原理:
网页请求过程分为两个环节
1.request(请求):向服务器发送访问请求
2.response(响应):服务器接收到用户的请求后,验证请求的有效性,然后向用户发送响应的内容
网页请求的方式有两种:
1.GET:最常见的方式,一般用于获取或查询资源信息,响应速度快。
2.POST:相比GET方式,还可以进行修改信息
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,则认为编码为ISO88591
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.网络爬虫的限制:
来源审查:判断UserAgent进行限制
检查来访HTTP协议头的UserAgent域,只响应浏览器或友好爬虫的访问
发布公告: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协议是建议但非约束性,网络爬虫可以不遵守,但存在法律风险
实例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))