Python网络爬虫(一)
2021/4/19 20:25:34
本文主要是介绍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网络爬虫与信息提取》课程第一周的内容。
非常感谢嵩天老师及其团队给我们带来这样优质的课程。
课程链接
这篇关于Python网络爬虫(一)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-08有遇到过吗?同样的规则 Excel 中 比Python 结果大
- 2024-03-30开始python成长之路
- 2024-03-29python optparse
- 2024-03-29python map 函数
- 2024-03-20invalid format specifier python
- 2024-03-18pool.map python
- 2024-03-18threads in python
- 2024-03-14python Ai 应用开发基础训练,字符串,字典,文件
- 2024-03-13id3 algorithm python
- 2024-03-13sum array elements python