目录
一 爬虫
1、什么是互联网?
互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样
2、互联网建立的目的?
互联网的核心价值在于数据的共享/传递:数据是存放于一台台计算机上的,而将计算机互联到一起的目的就是为了能够方便彼此之间的数据共享/传递,否则你只能拿U盘去别人的计算机上拷贝数据了。
3、什么是上网?爬虫要做的是什么?
我们所谓的上网便是由用户端计算机发送请求给目标计算机,将目标计算机的数据下载到本地的过程。 只不过,用户获取网络数据的方式是: 1.浏览器提交请求->下载网页代码->解析/渲染成页面。 而爬虫程序要做的就是: 2.模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中 1与2的区别在于: 我们的爬虫程序只提取网页代码中对我们有用的数据
4、爬虫
1.爬虫的定义:
向网站发起请求,获取资源后分析并提取有用数据的程序
2.爬虫的价值
互联网中最有价值的便是数据,比如天猫商城的商品信息,链家网的租房信息,雪球网的证券投资信息等等,这些数据都代表了各个行业的真金白银,可以说,谁掌握了行业内的第一手数据,谁就成了整个行业的主宰,如果把整个互联网的数据比喻为一座宝藏,那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏,掌握了爬虫技能,你就成了所有互联网信息公司幕后的老板,换言之,它们都在免费为你提供有价值的数据。
爬虫的分类
1.通用爬虫
通用爬虫是搜索引擎(Baidu、Google、Yahoo等)“抓取系统”的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。 简单来讲就是尽可能的;把互联网上的所有的网页下载下来,放到本地服务器里形成备分,在对这些网页做相关处理(提取关键字、去掉广告),最后提供一个用户检索接口。
2.聚焦爬虫
聚焦爬虫是根据指定的需求抓取网络上指定的数据。例如:获取豆瓣上电影的名称和影评,而不是获取整张页面中所有的数据值。
2.1 robots协议
如果自己的门户网站中的指定页面中的数据不想让爬虫程序爬取到的话,那么则可以通过编写一个robots.txt的协议文件来约束爬虫程序的数据爬取。robots协议的编写格式可以观察淘宝网的robots(访问www.taobao.com/robots.txt即可)。但是需要注意的是,该协议只是相当于口头的协议,并没有使用相关技术进行强制管制,所以该协议是防君子不防小人。但是我们在学习爬虫阶段编写的爬虫程序可以暂时先忽略robots协议。 Allow:允许的 Disallow:不允许的 User-agent: Baiduspider Allow: /article Allow: /oshtml Allow: /ershou Allow: /$ Disallow: /product/ Disallow: / User-Agent: Googlebot Allow: /article Allow: /oshtml Allow: /product Allow: /spu Allow: /dianpu Allow: /oversea Allow: /list Allow: /ershou Allow: /$ Disallow: / User-agent: Bingbot Allow: /article Allow: /oshtml Allow: /product Allow: /spu Allow: /dianpu Allow: /oversea Allow: /list Allow: /ershou Allow: /$ Disallow: / User-Agent: 360Spider Allow: /article Allow: /oshtml Allow: /ershou Disallow: / User-Agent: Yisouspider Allow: /article Allow: /oshtml Allow: /ershou Disallow: / User-Agent: Sogouspider Allow: /article Allow: /oshtml Allow: /product Allow: /ershou Disallow: / User-Agent: Yahoo! Slurp Allow: /product Allow: /spu Allow: /dianpu Allow: /oversea Allow: /list Allow: /ershou Allow: /$ Disallow: / User-Agent: * Disallow: /
2.2 反爬虫
门户网站通过相应的策略和技术手段,防止爬虫程序进行网站数据的爬取。
2.3 反反爬虫
爬虫程序通过相应的策略和技术手段,破解门户网站的反爬虫手段,从而爬取到相应的数据。
3.增量式爬虫
通过爬虫程序监测某网站数据更新的情况,以便可以爬取到该网站更新出的新数据。
二 爬虫的基本流程
1、发起请求 使用http库向目标站点发起请求,即发送一个Request Request包含:请求头、请求体等 2、获取响应内容 如果服务器能正常响应,则会得到一个Response Response包含:html,json,图片,视频等 3、解析内容 解析html数据:正则表达式,第三方解析库如Beautifulsoup,pyquery等 解析json数据:json模块 解析二进制数据:以b的方式写入文件 4、保存数据 数据库 文件
三 请求与响应
#http协议: http://www.cnblogs.com/linhaifeng/articles/8243379.html #Request: 用户将自己的信息通过浏览器(socket client)发送给服务器(socket server) #Response: 服务器接收请求,分析用户发来的请求信息,然后返回数据(返回的数据中可能包含其他链接,如:图片,js,css等) #ps: 浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,是要提取其中的有用数据。
四 requests
#1、请求方式: 常用的请求方式:GET,POST 其他请求方式:HEAD,PUT,DELETE,OPTHONS ps:用浏览器演示get与post的区别,(用登录演示post) post与get请求最终都会拼接成这种形式:k1=xxx&k2=yyy&k3=zzz post请求的参数放在请求体内: 可用浏览器查看,存放于form data内 get请求的参数直接放在url后 #2、请求url url全称统一资源定位符,如一个网页文档,一张图片 一个视频等都可以用url唯一来确定 url编码 https://www.baidu.com/s?wd=图片 图片会被编码(看示例代码) 网页的加载过程是: 加载一个网页,通常都是先加载document文档, 在解析document文档的时候,遇到链接,则针对超链接发起下载图片的请求 #3、请求头 User-agent:请求头中如果没有user-agent客户端配置, 服务端可能将你当做一个非法用户 host cookies:cookie用来保存登录信息 一般做爬虫都会加上请求头 #4、请求体 如果是get方式,请求体没有内容 如果是post方式,请求体是format data ps: 1、登录窗口,文件上传等,信息都会被附加到请求体内 2、登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post
五 response
#1、响应状态 200:代表成功 301:代表跳转 404:文件不存在 403:权限 502:服务器错误 #2、Respone header set-cookie:可能有多个,是来告诉浏览器,把cookie保存下来 #3、preview就是网页源代码 最主要的部分,包含了请求资源的内容 如网页html,图片 二进制数据等
六 案例
1.爬取搜狗首页的源码数据
我们访问https://www.sogou.com/这个url 其实发送了很多请取 但是我是只要的是一部分
代码
import requests #导入requests模块 url = "https://www.sogou.com/" #请求路径url response = requests.get(url=url) #发送请求 sougou_text = response.text #获取响应数据 返回的是 unicode 型的文本数据 with open ('sougou.html','w',encoding='utf-8') as f: #持久化存储 f.write(sougou_text)
2.基于搜狗编写简单的网页采集
基于get请求的爬取 出现的问题 1.乱码 response.encoding='utf-8' ##手动修改响应数据的编码 解觉乱码问题 2.量级不够 3.反扒 headers参数是用来实现UA伪装 4.请求参数动态化 params参数表示的是对请求url参数的封装
代码
import requests search = input('输入要搜索的内容:') #会自动生成一个input框 url="https://www.sogou.com/web" #请求路径 params={ 'query':search #存储的就是动态的请求参数 #一定需要将params作用到请求中 #params参数表示的是对请求url参数的封装 } # headers参数是用来实现UA伪装 不会被游览器检测出来 headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' } response = requests.get(url=url,params=params,headers=headers) #发起请求 response.encoding='utf-8' ##手动修改响应数据的编码 解觉乱码问题 respones_text = response.text #获取响应对象 filename = search+'.html' #注意这个html 是 .html,不加这个点只会得到html字符型的数据 with open(filename,'w',encoding='utf-8') as f:#持久化存储 f.write(respones_text) print(search+'获取成功')
3.爬取豆瓣电影的电影详情数据
针对ajax请求
抓包 查看是发什么url 带什么参数 返回什么json
查看josn数据
import requests start = input('请输入开始数据') limit = input('请输入数据个数') url="https://movie.douban.com/j/chart/top_list" parmas={ 'type': '5', 'interval_id' :'100:90', 'action': '', 'start': start, 'limit': limit, } ''' data={ 'on': 'true', 'page': '1', 'pageSize':'15', 'productName': '', 'conditionType': '1', 'applyname': '', 'applysn':'', } ''' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' } response = requests.get(url=url,params=parmas,headers=headers) #post请求的格式为:requests.post(url=url,headers=headers,data=data) movie_list = response.json() #把响应的格式进行转换 目的将str转为json f = open('dbmovie.txt','w',encoding='utf-8') for dict in movie_list: #循环,字典格式数据 title = dict['title'] score = dict['score'] f.write(title+':'+ score+'\n') print(title,'获取成功') f.close()
肯德基的案例
- 肯德基餐厅查询http://www.kfc.com.cn/kfccda/storelist/index.aspx
- 分析:
- 动态加载数据
- 动态加载数据
- 概念:通过其他/另一个请求请求到的数据
- 特性:可见非可得
- 判定相关的页面数据是否为动态加载的数据?
- 基于抓包工具定位到浏览器地址栏url对应的请求数据包,进行局部搜索:
- 搜索到:这组被搜索的数据不是动态加载的,可以直接爬取
- 没有搜到:这组数据是动态加载的,不可以直接爬取。
- 基于抓包工具定位到浏览器地址栏url对应的请求数据包,进行局部搜索:
- 如何捕获动态加载的数据?
- 基于抓包工具进行全局搜索,最终可以定位到动态加载数据对应的数据包。
import requests headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36' } data = { 'cname': '', 'pid': '', 'keyword': '广州', 'pageIndex': '1', 'pageSize': '10', } url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' response = requests.post(url=url,headers=headers,data=data) pos_data = response.json() pos_data
药监总局数据爬取
- 药监总局数据爬取,爬取的是每一家企业的详情数据
- 分析:
- 打开了某一家企业的详情页面,看到了企业的详情数据
- 判定改家企业的详情数据是否为动态加载的?
- 进行局部搜索
- 没有搜索到,说明数据是动态加载出来的
- 捕获动态加载的数据?
- 全局搜索,定位到了动态加载数据对应的数据包,提取出了url和请求参数
- 进行局部搜索
- 成功的捕获到了一家企业对应的详情数据
- 通过上述方式继续分析第二家企业,发现:
- 捕获每一家企业的id
- 在首页中,通过抓包工具对企业名称进行搜索,对应的数据包中发现了企业名称和id
#获取企业id ids = [] #存储所有企业的id url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList' for page in range(1,6): data = { 'on': 'true', 'page': str(page), 'pageSize': '15', 'productName': '', 'conditionType': '1', 'applyname': '', 'applysn': '', } company_datas_json = requests.post(url=url,headers=headers,data=data).json() for dic in company_datas_json['list']: _id = dic['ID'] ids.append(_id) detail_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById' for _id in ids: data = { 'id':_id } company_json = requests.post(url=detail_url,headers=headers,data=data).json() print(company_json['epsName'],company_json['epsProductAddress'])
4.获取斗图网的一张图片
方式一:
斗图网:http://www.doutula.com/ import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' } url = 'http://ww4.sinaimg.cn/large/6af89bc8gw1f8op8nin2ug206t05k7s0.gif' # 图片的地址链接 image = requests.get(url=url,headers=headers).content # content,因为返回图片的数据类型是bytes类型,所以用content,类似于图片,音频,视频类的数据用content解码 with open('./img.jpg','wb') as f: f.write(image)
方式二:
from urllib import request # 导入urllib url = 'http://ww4.sinaimg.cn/large/6af89bc8gw1f8op8nin2ug206t05k7s0.gif' request.urlretrieve(url,'./image2.jpg') # urlretrieve需要的参数,url和存储 # urllib把发送请求和持久化存储封装,urllib是一个请求模块,比较老 # 不可以使用UA伪装
总结
爬虫 需要分析 数据是不是所见所可的得 下一个数据的爬取可能要 另一个爬取数据的支持
来源:https://www.cnblogs.com/saoqiang/p/12400934.html