java查询数据库python爬⾍基础知识整理
本⽂主要记录python爬⾍的基础知识点,主要知识:理论基础、爬⾍技能简述、实现原理和技术、uillib库和urlerror、headers属性和代理服务器设置。
1)理论基础部分
代码转换器的实验报告⽹络爬⾍⼜称⽹络蜘蛛、⽹络蚂蚁、⽹络机器⼈等,可以按照我们设置的规则⾃动化爬取⽹络上的信息,这些规则被称为爬⾍算法。
2)爬⾍的组成有控制节点、爬⾍节点和资源库
个⼈简单理解就是控制节点相当CPU,根据url分配线程,爬⾍节点相当于GPU负责进⾏具体的爬取数据
3)爬⾍类型
通⽤⽹络爬⾍,主要⽤于⼤型搜索引擎中,由于其爬取范围⼴、数据量⼤所以对性能的要求较⾼
聚焦⽹络爬⾍,按照预先定义好的主题进⾏有选择性的爬取,所以节省了资源,可以⽤于特定场景为特定⼈服务,另外还有增量式⽹络爬⾍和深层⽹络爬⾍有时间可以深⼊了解
4)爬⾍实现原理
通⽤⽹络爬⾍:
------- 获取初始的url
------- 根据初始的url爬取页⾯并获得新的url
------- 将新的url放到url队列中
------- 从url队列中读取新的url,并根据新的url爬起⽹页,同时从新⽹页中获取新url,并重复上述过程
------- 满⾜爬⾍系统设置的停⽌条件时,停⽌爬取
聚焦⽹络爬⾍:
-------对爬取⽬标的定义和描述
-------获取初始的url
-------根据初始的url爬取页⾯,并获得新的url
-
------从新的url中过滤掉与爬取⽬标⽆关的链接
-------将过滤后的链接放的url队列中
-------从url队列中,根据搜索算法,确定url的优先级,并确定下⼀步要爬取的url地址
-------从下⼀步要爬取的url地址中,读取新的url,然后依据新的url地址爬取⽹页,并重复上述爬取过程
------满⾜爬⾍的停⽌条件时或⽆法获取新的url时停⽌爬
5)爬⾏策略有深度优先爬⾏策略、⼴度优先爬⾏策略、⼤站优先爬⾏策略、反链策略、其他爬⾏策略
以这张图为例,如果假设有这样⼀个⽹站,⽹站⾥有⼀下这些页⾯,如果⽤深度优先策略爬取那么会⾸先爬取⼀个⽹页然后将这个⽹页的下层链接⼀次深⼊爬完再返回上⼀层进⾏爬取顺序为。A-D-E-B-C-F-G
如果是⼴度优先爬⾏策略的话,就会⾸先爬取同⼀层次的⽹页,将同⼀层次的⽹页爬完之后,再选择下⼀层次的⽹页去爬取顺序为A-B-C-D-E-F-G,
另外还有⼤站优先爬⾏策略,可以按照对应⽹页所属的站点归类,⽹站的⽹页数量多,就可以被成为⼥⼤站,那我就优先爬取⼤站的数据。
反链爬取指的是该⽹页被其他⽹页指向的次数,这个次数在⼀定程度上代表该⽹页被其他⽹页推荐的次数,这中爬取⼀般会考虑可靠的反链数,这样可以排除⽤垃圾站将⽹页互相连接从⽽得到较⾼的连接数的作弊情况
6)⽹页更新策略,常见的更新策略有
⽤户体验策略:搜索引擎在查询某个关键词时,会有⼀个排名结果,⽤户⼀般都会访问排名靠前的前的⽹站,所以在服务器资源有限的情况下,会优先更新排名靠前的⽹站
历史数据策略:依据⽹页的历史数据通过泊松过程进⾏建模,从⽽确定下⼀次的更新时间,进⽽确定下⼀次爬取的时间
聚类分析策略:如果⼀个⽹页时新⽹站,没有历史数据可供分析,并且如果去存储历史数据就会增加服务器的负担,依据⽹页⼀些共性进⾏重新分类
7)⽹页分析算法有基于⽤户⾏为的⽹页分析算法、基于⽹络拓扑的⽹页分析算法、基于⽹页内容的⽹页分析算法
urllib库和异常处理
使⽤urllib爬取⽹页:⾸先导⼊模块,这样爬取的数据是⼀些编码,不能读取
quest
这样就爬取到了对应的⽹页数据,如何读取这些数据呢
quest
还可以直接爬取数据并保存到⽂件,这种⽅法产⽣的缓存可以⽤urlretrieve()清除
数据库update的用法及例句quest.urlcleanup#这种⽅法产⽣的缓存可以⽤urlretrieve()清除
f.info()#返回当前环境的有关信息
⼀般url标准中只会允许⼀部分ASCII字符⼊数字、字母、部分符号等,如果是汉字或以下特殊字符⽐如:&等就需要编码,可⽤下⾯的⽅法编码和解码
有⼀些⽹站在爬取时会出现403错误,⽆法爬取的情况,这是⽹站做了反爬⾍设置,此时可以设置Headers信息,模拟成浏览器访问这些⽹页,如何得到headers信息呢
将User-Agent这⼀段复制下来,这个段可以重复使⽤所以拿到后可以保存以后继续⽤
⽅法⼀,⽤build_opener()改报头
url='⽹址'
h=('User-Agent','头信息')
quest.build_opener()#创建⾃定义opener对像并赋值给op
op.addheaders=[h]#添加头信息
data=opener.open(url).read()#打开⽹址读取数据
⽅法⼆⽤add_header添加报头
url='⽹址'
quest.Request(url)#创建⼀个request对象赋给r
r.add_header('User-Agent','头信息')
quest.urlopen(r).read()
超时设置,在爬取⽹页时我们会遇到超时⽆法打开⽹页的情况,我们可以设置超时时间避免
quest
for i in range(1,100):
try:
quest.urlopen('all',timeout=0.1).read()#timeout参数就是⽤来设置超时时间的让div设置固定宽度并居中
print(len(data))
except Exception as e:#异常扑捉
print('出现异常---->'+str(e))#⽤字符串格式打印出扑捉到的异常信息
HTTP请求,主要说GET请求和POST请求
GET请求会通过url⽹址传递信息,可以在⽹址中直接写上要传递的信息,⽐如这个⽹址
其实上⾯这个⽹址我们可以简化为⼀下形势,⼀样可以到页⾯,这个字段wd=就是我要查询的信息
quest
'''
key='linux'
url='s.taobao/search?q='+key
print(url)
构造GET请求
quest.Request(url)
'''
quest.urlopen('s.taobao/search?ie=&q=iphonex').read()#请求数据
#写⼊⽂件
f=open('F:/uuuu/2.html','wb')
f.write(data)
f.close()
上⾯的代码就是简单的GET请求,我拿到的html⽂件再本地打开⼀直在加载,写⼊txt⽂件查看源码没有问题,所以其实是得到的正确的数据,⾄于为什么html⽂件加载不出来这个不太重要,因为我们爬到数据主要是分析⽽不是为了看他的页⾯
POST请求,再登陆、注册等操作时都会⽤到POST请求。
这部分可以查看我之前⼀篇博⽂,blog.csdn/chen_ke_hao/article/details/78145373
代理服务器设置
⽤同⼀个ip爬取同⼀个⽹页久了会被屏蔽,所以我们就需要设置代理服务器爬取,
def daili(proxy,url):
quest.ProxyHandler({'http':proxy})#设置对应的代理服务器信息
quest.build_opener(quest.HTTPHandler)#设置⼀个⾃定义opener对象,1参为代理信息,2参为HTTPHandler类 quest.install_opener(op)#将op安装为全局,这样在使⽤urllib的时候亦会使⽤我们安装的op对象,所以下⾯才能直接⽤urllib爬取数据 quest.urlopen(url).read()#.decode('utf-8')
windowsupdatereturn data
proxy='121.232.146.146:9000'
data=daili(proxy,'www.csdn/')
f=open('F:/uuuu/4.html','wb')
f.write(data)
f.close()
print(len(data))
Debuglog实例
Debuglog可以程序运⾏中,边运⾏边打印调试⽇志,这⾥举⼀个简单例程
quest.HTTPHandler(debuglevel=1)#带上这个参数就会打印⽇志
quest.HTTPSHandler(debuglevel=1)
quest.build_opener(http,http1)#将对象赋予opener
quest.urlopen('www.csdn/').read()#读取数据
print(len(data))
异常处理-URLerror
程序在执⾏中可能会出现异常,这时就需要异常处理以避免程序退出,异常处理常⽤的是URLerror类和HTTPerror类
⼀般来说,产⽣URLError的原因有如下⼏种可能
1)连接不上服务器
2)远程URL不存在
python基础知识整理3)⽆⽹络
4)触发了HTTPError(连接到了⽬标,但是被服务器拒绝,所以这个异常就会给返回⼀个状态码⽐如403、404等)
状态码的含义:
200 OK ⼀切正常
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论