python爬虫
一、爬虫基本概念:
1、爬虫法律问题
2、爬虫定义
3、通用爬虫和聚焦爬虫的区别与联系
4、url的搜索策略(基于ip地址搜索,广度优先,深度优先,最佳优先)
二、网页的基础知识:
1、url的概念
2、http和https
3、http的请求过程
4、请求,四部分内容:
5、响应,三部分内容:
6、网页构成:
三、爬虫基本的原理:
1、获取网页的源代码(通过请求库发起http请求)
2、提取信息(分析网页源代码,提取数据)
3、保存数据(本地,数据库)
四、爬取技巧
1、爬取多页:
2、动态渲染页面的爬取:
五、反爬虫:
1.使用user-agent模拟浏览器,header加入
2.多账号登录:加入cookies,cookies池
3.代理:突破ip的限制,ip池,requests.get(url,proxies=proxies,timeout=10)
4.验证码OCR识别,机器学习方法,接入打码平台
5.使用selenium完全模拟浏览器
6.抓包软件分析
一、爬虫基本概念:
1、爬虫法律问题
从目前的实践来看,如果抓取数据的行为用于个人使用,则不存在问题:而如果数据用于转载或者商业用途,那么抓取的数据类型就非常关键。
从很多历史案件来看,当抓取的数据是现实生活中的真实数据(比如,营业地址、电话清单)时,是允许转载的。但是,如果是原创数据(比如,意见和评论),通常就会受到版权限制
无论如何,当你抓取某个网站的数据时,请记住自己是该网站的访客,应当约束自己的抓取行为,否则他们可能会封禁你的IP,甚至采取更进一步的法律行动。这就要求下载请求的速度需要限定在一个合理值之内,并且还需要设定一个专属的用户代理来标识自己
2、爬虫定义
网络爬虫(Crawler)又被称为网页蜘蛛(Spider),网络机器人,网页追逐者,它是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。
狭义与广义定义:狭义上指遵循标准的http协议,利用超链接和Web文档检索方法遍历万维网的软件程序;而广义的定义则是能遵循http协议,检索Web文档的软件都称之为网络爬虫。
3、通用爬虫和聚焦爬虫的区别与联系
通用爬虫,搜索引擎和web服务商用的爬虫系统。通用网络爬虫是捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份
聚焦爬虫,是"面向特定主题需求"的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于:聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息
4、url的搜索策略(基于ip地址搜索,广度优先,深度优先,最佳优先)
①基于ip地址搜索
先赋予爬虫一个起始的IP地址,然后根据IP地址递增的方式搜索本口地址段后的每一个WWW地址中的文档,它完全不考虑各文档中指向其它Web站点的超级链接地址。
优点是搜索全面,能够发现那些没被其它文档引用的新文档的信息源。
缺点是不适合大规模搜索。
②广度优先搜索策略
广度优先搜索策略是指在抓取过程中,在完成当前层次的搜索后,才进行下一层次的搜索。这样逐层搜索,依此类推。
该算法的设计和实现相对简单。为覆盖尽可能多的网页,一般使用广度优先搜索方法。
③深度优先搜索策略
深度优先搜索在开发网络爬虫早期使用较多的方法之一,目的是要达到叶结点,即那些不包含任何超链接的页面文件。
从起始页开始在当前HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。当不再有其他超链可选择时,说明搜索已经结束。
④最佳优先搜索策略
最佳优先搜索策略按照一定的网页分析算法,先计算出URL描述文本的目标网页的相似度,设定一个值,并选取评价得分超过该值的一个或几个URL进行抓取。它只访问经过网页分析算法计算出的相关度大于给定的值的网页。
存在的一个问题是,在爬虫抓取路径上的很多相关网页可能被忽略,因为最佳优先策略是一种局部最优搜索算法。因此需要将最佳优先结合具体的应用进行改进,以跳出局部最优点。
有研究表明,这样的闭环调整可以将无关网页数量降低30%-90%。
二、网页的基础知识:
1、url的概念
URL(Uniform Resource Locator),即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
2、 http和https
①超文本:hypertext,浏览器里面看到的网页就是超文本解析而成,其网页源代码是一系列html代码,如img表示图片,p指定段落。
②Http基本原理
http和https:访问资源需要的协议类型,还有其他的类型,ftp,sftp,smb等
http:hyper text transfer protocol,超文本传输协议,网络传输超文本数据到本地浏览器的传送协议,保证高效而准确的传送超文本文档
https : Hyper Text Transfer Protocol over Secure SocketLayer,以安全为目标的http通道,http下加入ssl层
作用:建立一个信息安全通道来保证数据传输的安全,确认网站的真实性
3、http的请求过程
①浏览器中输入url后,浏览器向网站所在服务器发送了一个请求,网站服务器接收请求,并对这个请求进行处理和解析,然后返回对应的响应,传回给浏览器,再通过浏览器解析出来。
②浏览器请求过程。
4、请求,四部分内容:
①请求的网站(request url)
②请求的方法:
a.get请求:
✓ 请求中的参数包含在url里面
✓ 请求提交的数据最多只有1024字节
✓ 百度中输入关键字,wd表示要搜索的关键字
b.post请求:
✓ 表单提交时候发起,用户登录
✓ 数据以表单的形式传输,不会体现在url中
✓ 请求提交的数据没有大小限制
✓ 数据传输更安全(参数不会体现在url中)
③请求头:cookie,user-agent
用来说明服务器要使用的附加信息,比较重要的信息有cookie,user-agent
④请求体:get请求体位空,post请求体为表单数据
5、响应,三部分内容:
①响应状态码:200为ok
②响应头 response header
包含了服务器对请求的应答信息,如contenttype,server,set-cookis等。
③响应体:响应的正文数据,网页源代码,json数据,二进制文件(图片,音频,视频)
爬虫请求后解析的内容就是响应体,响应的正文数据,比如请求网页时,响应体是html代码;请求一张图片时,响应体为图片的二进制数据;json数据等。
6、网页构成:
①html:骨架,决定网页的结构,head节点,title节点等
决定网页的结构和内容(是什么),元素标记头部文件,用
②CSS:皮肤,决定网页的表现样式,放在head里面的style里面
层叠指在html中引用了数个样式文件,并且样式发生冲突时候,浏览器能依据层叠顺序处理。
样式指设定网页的表现样式(什么样子)。将网页样式提取出来方便更改某一类元素的样式,通过
③js:肌肉,网页动画和交互性,script里面
Html和Css只是实现静态信息,缺乏交互性。网页的交互和动画效果通过JavaScript实现, JavaScript通过单独的文件形式加载,后缀为js Html中通过
三、爬虫基本的原理:
1、获取网页的源代码(通过请求库发起http请求)
①urllib:
urlopen:最基本的,可以get或者post请求
Request:先声明reques对象,可以加入header信息,再用urlopen打开
#get请求,访问百度
import urllib.request
response=urllib.request.urlopen('http://www.baidu.com') # 发送请求
print(response.read().decode('utf-8')) #解码后的响应
#post请求
import urllib.parse
import urllib.request
da = bytes(urllib.parse.urlencode({
'word':'hello'}),encoding='utf-8')#urlencode方法将参数字典转换为字符串
response = urllib.request.urlopen('http://httpbin.org/post',data=da)
print(response.read())
②requests:优先考虑使用
get请求:param参数
post请求:data参数,传表单数据
header信息,可以带cookies,agent
# 爬取豆瓣电影分类动漫排行榜并导出到本地
import time
import random
import requests
data1=pd.DataFrame()
for i in range(6):
print('正在爬取第%s页'%i)
i=i*20
qurl="https://movie.douban.com/j/chart/top_list?type=25&interval_id=100%3A90&action=&start="
url=qurl+str(i)+'&limit=20'
header={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'}
response=requests.get(url,headers=header) #requests.get方法
html=response.content.decode('utf-8')
df=pd.read_json(html) #json数据可直接用数据框方法转换
data1=pd.concat([data1,df])
time.sleep(random.randint(6,9))
print('爬取完毕')
data2=