Python网络爬虫(一)
网络爬虫之规则
requests库入门
requests的get方法
- r = requests.get(url)
构建一个request对象向服务器请求资源,返回一个包含服务器资源的response对象。
requests.get(url, parm, *kwags)
url:网页的url链接
parm:url中的额外参数,字典或字节流的格式,可选
kwags:12个控制访问的参数
- Response对象
Response对象的属性:
| 属性 | 说明 |
|---|---|
| r.stauts_code | HTTP请求的返回状态200表示成功,其他数值则是失败 |
| r.text | HTTP请求的相应内容,是字符串形式,也即url页面内容 |
| t.encoding | 从HTTPheader中猜测的编码方式 |
| r.apparent_encoding | 从返回内容中分析的编码方式 |
| r.content | HTTP响应内容的二进制形式 |
r.encoding和r.apparent_encoding的区别:有的服务器对编码是有要求的则header中会有charset字段,如果没有则默认为ISO-8859-1,而apparent_encoding则是分析内容来解析信息。
爬取网页的通用代码框架
- 理解request库的异常
| 异常 | 说明 |
|---|---|
| requests.ConnectionError | 网络连接错误,如DNS无效,域名无效等 |
| requests.HTTPError | HTTP、异常 |
| requests.URLError | URL异常 |
| requests.ConnectTimeout | 服务器连接超时 |
| requests.Timeout | URL请求超时 |
| r.raise_for_status() | 若r.status_code返回不是200,则产生HTTPError |
- 常用框架
import requests
def getHTMLText(url):
try:
r = requests.get(url)
r.raise_staus_code()
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
HTTP协议和requests库的主要方法
- HTTP(Hypertext Transfer Protocol):超文本传输协议,是基于请求与相应模式的、无状态(请求之间无关联)的应用层协议。
- URL格式:http:// host[:port][path]
host:Internet主机域名或IP地址
port:端口号,默认为80
path:请求资源的路径
http://www.bit.edu.cn
URL是一个在Internet上存储资源的路径。
| HTTP协议方法 | requests库 | 说明 |
|---|---|---|
| GET | requests.get() | 获取资源 |
| HEAD | requests.head() | 获取资源的头部信息 |
| PUT | requests.put() | 在URL对应的资源后添加资源 |
| POST | requests.post() | 对URL的资源进行覆盖 |
| PATCH | requests.patch() | 对URL的部分内容更新 |
| DELETE | requests.delete() | 删除URL的资源 |
patch和put的区别,patch是将部分资源进行局部更新,而put则是全覆盖,没有更新的自动做删除处理。
Requests 库主要方法解析
requests.request(method, url, **kwags)
method:方法的参数即包含GET等等。而get等方法即已经得到封装的request方法。
url:URL链接
**kwags:12个参数,分别实现不同功能
12个参数
- params:字典或字节序列,作为参数加到URL后面
kv = {'key1':'vaule1','key2':'vaule2'}
r = requests.request('GET',"https:/python123.io/ws", params = kv)
>>> "https:/python123.io/ws?key1=vaule1&key2=vaule2"
- data:字典或字节序列或文件对象,作为request的内容传递给服务器
kv = {'key1':'vaule1','key2':'vaule2'}
r = requests.request('POST',"https:/python123.io", data = kv)
- json:json格式的内容,作为数据传递给服务器
kv = {'key1':'value1'}
r = requests.request('POST',"https:/python123.io", json=kv)
- headers:字典类型,属于HTTP协议的定制头
hd = {'user-agent':'chrome/10'}
r = requests.request('GET', 'https:/python123.io', headers=hd)
- cookies:字典或CookieJAR,Requests中的Cookie
- auth:元组,支持HTTP的认证功能
- file:字典类型,传输文件
fi = {'file': open('data.txt','rb')}
r = requests.request('POST','https:/python123.io', files=fi)
- timeout:设置超时时间,以秒为单位
r = requests.request('GET', 'https:/python123.io', timeout=10)
- proxies:字典类型,设定代理服务器,可以增加登陆验证,可用于重定向访问IP以保护爬虫隐私
px = {'HTTP':'http://user@10.10.1.1234'\
'HTTPS':'https://1.0.1.0.4321'}
r = requests.request('GET', 'https:/python123.io', proxies = px)
- allow_redirects:True/False,默认为True,设置是否允许重定向
- stream:True/False,默认为True,设置是否获取内容立即下载开关
- verify:True/False,默认为True,认证SSL证书开关
- cert:本地SSL证书路径
网络爬虫的“盗亦有道”
网络爬虫引发的问题
- 爬取网页:使用requests库即可,小规模,数据量小
- 爬取网站和系列网站:使用scrapy库,中规模,数据量较大
- 爬取全网:即搜索引擎,只能定制开发
某些爬虫会对服务器造成大量的资源开销。
同时存在法律风险,数据是有所有者。
可能给个人隐私带来很大的风险。
对网络爬虫进行限制:
- 可以对协议头进行限制,只允许headers中的user_angent是浏览器和允许的友好爬虫进行访问。
- 发布Robot协议,要求爬虫遵守相应的规定。
Robots协议
在网站的根目录下写一个叫Robots.txt的文件。
如果没有Robots.txt文件,则表示网站允许所有爬虫爬取所有的内容。
user_agent: #这里表示爬虫的名字,全部则为*
disallow: # 这里表示不允许爬取的目录,全部则为/ 表示根目录
Robots协议的遵守方式
网络的爬虫应该能自动识别并遵守Robots协议。如果不遵守,则存在法律风险。
对服务器的访问一天只存在几次访问,类似于人类的行为,则原则上可以不遵守Robots协议。
5个实例
- 京东商品信息爬取
import requests
url = "https://item.jd.com/2967929.html"
try:
r = requests.request('GET', url, headers = {'ueser-agent':'chrome/12'})
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:1000])
except:
print("访问出错")
注意:京东商品被限制需要登陆才能爬取,所以这里应该是得不到结果的。
2. 亚马逊商品爬取
import requests
url = 'https://www.amazon.cn/dp/B0864LWWX9/ref=lp_665002051_1_2'
try:
r = requests.request('GET', url, headers={'user-agent':'Nozilla/5.0'})
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:1000])
except:
print('爬取错误')
注意:亚马逊商品的爬取因为有保护,必须要修改user-agent才能进行访问
3. 百度和360爬取
import requests
url1 = "http://www.baidu.com/s"
url2 = "http://www.so.com/s"
keyword1 = {'wd':'python'}
keyword2 = {'q':'python'}
try:
r1 = requests.request('GET', url1, params = keyword1)
r2 = requests.request('GET', url2, params = keyword2)
print(r1.request.url)
print(r2.request.url)
r1.raise_for_status()
r2.raise_for_status()
r1.encoding = r1.apparent_encoding
r2.encoding = r2.apparent_encoding
print(r1.text[:1000])
print(r2.text[:1000])
except:
print("爬取失败")
注意:百度和360最后的格式分别是 "/s?wd = keyword"和"/s?q = keyword",所以可以使用params进行直接在URL后的操作
4. 图片下载
import requests
import os
url = "https://w.wallhaven.cc/full/pk/wallhaven-pkkm6p.png"
root ="C://Users//ADM//Pictures//"#其实用的是默认图片路径涉及隐私所以改了一点
path = root + url.split('/')[-1]
try:
if not os.path.exists(root):
os.mkpath(root)
if not os.path.exists(path):
r = requests.request('GET', url)
with open(path, 'wb') as f:
f.write(r.content)
f.close()
else:
print("file has already existed!")
except:
print("ERROR!")
需要注意:图片是二进制文件,必须要用r.content来返回。然后就是必须事先建立好文件,然后再进行写入操作。
5. IP地址的查询
import requests
IP = "202.204.80.112"
url = "https://m.ip138.com/iplookup.asp?ip="
try:
r = requests.request('GET',url+IP, headers= {'user-agent':'chrome/10'})
print(r.request.url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[2400:2500])
except:
print("爬取错误!")
这里要注意,也要对协议头中的user-agent字段进行修改,否则爬取不成功。
以上内容来自北京理工大学嵩天老师及其团队的《Python网络爬虫与信息提取》课程第一周的内容。
非常感谢嵩天老师及其团队给我们带来这样优质的课程。
课程链接

浙公网安备 33010602011771号