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,则认为编码为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))
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协议是建议但非约束性,网络爬虫可以不遵守,但存在法律风险
四.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))
大佬,请问这个IP地址归属地的自动查询里面的查询接口https://m.ip138.com/iplookup.asp?ip=是怎么得到的呢?和嵩天老师讲的不一样
这种接口的地址网上一大推,搜一下就有免费的接口可以用了
想问一下, 关于亚马逊的爬取,按照老师的操作为啥 r.status_code 仍然显示503
你好,现在亚马逊爬虫需要携带user-agent请求头去爬取,因为你直接使用request库爬取的话,会亚马逊被识别成爬虫,不让你访问,而这个浏览器请求头user-agent是可以模拟浏览器去爬取,不过你最好是可以再携带个登录账号cookie去爬,这样成功率高一些,上面说的这些都是最简单反爬虫的策略。
我把代码发给你吧
import requests
def httpymxtext(url):
try:
kv={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
}
r=requests.get(url,headers=kv)#通过headers模拟浏览器爬取信息
r.raise_for_status()
print(r.status_code)
r.encoding=r.apparent_encoding
return (r.text[1000:2000])
except:
print("爬取失败")
if __name__=="__main__":
url='https://www.amazon.cn/gp/product/B01M8L5Z3Y'
print(httpymxtext(url))
谢谢!!
你好 比较小白,请不吝赐教 看嵩天老师视频,学着安装了requests 可是 不知道他进行网页爬取打开的是什么软件,懵了
你是说写代码的ide还是什么?