1、网络爬虫(网络蜘蛛,网络机器人)
1、定义:抓取网络数据的程序
2、用Python程序模仿人点击浏览器访问网站
3、目的:获取大量数据进行分析
2、企业获取数据的方式
1、公司自有的数据
2、第三方数据平台购买
3、爬虫爬取数据:市场上没有,或者价格太高
3、Python做爬虫优势
请求模块,解析模块丰富成熟,强大的Scrapy爬虫框架
请求网站后返回的是网站的全部代码,而解析模块可以网页进行分析获取我们想要数据
PHP:对多线程,异步支持不太好
JAVA:代码笨重,代码量大
C/C++:虽然效率高,但是代码成型慢
4、爬虫分类
1、通用网络爬虫(搜索引擎引用,需要遵循robots协议)
比如:谷歌,百度网站
robots协议:网站通过Robots协议告诉搜索引擎那些页面可以抓,那些页面不可以抓
说明:
每一个网站都有robots协议,有百度快照字样就是百度爬取的网站
2、搜索引擎如何获取一个新网站的URL呢
1、网站主动向搜索引擎提供(百度站长平台)
2、DNS服务器(万网),快速收录网站
3、聚焦网络爬虫
自己写的爬虫程序:面向主题爬虫,面向需求爬虫
5、爬取数据步骤
1、确定需要爬取的URL地址
2、通过HTTPS/http协议获取相应HTML页面
3、解析相应
1、所需数据,保存
2、页面中新的URL,继续第二步
6、web
1、URL:
scheme://host[:port]/path/..../[?query-string][#anchor]
协议 域名 端口 资源路径 查询参数 锚点
https://www.cnblogs.com/followlqc/p/11059943.html (前端页面源码带#的是锚点)
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=request_25_pg&wd=URL%208&oq=URL&rsv_pq=af88360f000634cf&rsv_t=b435hopykhl%2BknVEBM3T%2Fhq4GWhwmViQ7dmPg6TTbxbFQ8M6NOK%2BdBCzuL%2B2agWX5Ypk0Q&rqlang=cn&rsv_enter=1&rsv_sug3=3&rsv_sug1=2&rsv_sug7=100&rsv_sug2=0&inputT=1930&rsv_sug4=2357
多个查询参数之间用&做分隔
锚点跳到网页指定位置
7、请求头(Request Headers)
#接受数据类型
#是否支持压缩,解压缩
#支持的语言
#缓冲控制
>0直接从浏览器缓存中提取
<0向浏览器请求确认,该资源是否修改
#支持长连接
#服务器可能检查
#升级https
#浏览器信息
8、get请求和post请求
1、GET:查询参数在URL上面显示出来
2、POST:FORM表单提交,传输大文件,数据隐藏能赶在form表单中,不会再URL中显示
9、爬虫请求模块(urllib.requsest)
常用方法:
1、urllib.request.urlopen('URL地址')
作用:向网站发起请求并获取响应对象
2、重构user-Agent
1、不支持重构:User-Agent:urlopen
2、支持重构:User-Agent:urllib.request.Request
2、urllib.requqest.Request('URL',header={})
使用流程
1、创建请求对象
2、发请求获取相应对象
3、获取响应内容
3、获取响应对象的方法response
1、read()
2、getcode():返回http响应码
200:成功
302:临时转移至新url
404:页面未找到
500:服务器异常
3、geturl()
1、返回实际数据的url
6、编码模块(urllib.parse)
1、urllib.parse.urlemcode({})
写程序:输入你要搜索的内容
保存到本地.....html..
import urllib.request import urllib.parse #首先拼接一个url key=input('输入你需要搜索的内容') baseurl = 'https://www.baidu.com/s?' wd = {'wd':key} key = urllib.parse.urlencode(wd) url = baseurl + key headers = {'User-Agent':'ozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'} req = urllib.request.Request(url,headers=headers) res = urllib.request.urlopen(req) html = res.read().decode('utf-8') with open('suosou.html','w',encoding='utf-8') as f: f.write(html) print('搜索结束')
7、案例:百度贴吧数据抓取
1、要求
1、输入抓取的贴吧名称
2、起始页
3、终止页
4、保存到本地:第一页HTML,第二页HTML。。。。
2、步骤
1、找url规律,拼接url
2、第一页:http://
3、获取页面内容(发请求获取响应)
4、保存(本地,数据库)
import urllib.request import urllib.parse import random import time #首先拼接一个url header_list=[{"User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"}, {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"}, {"User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)"} ] headers=random.choice(header_list) #主程序 name = input("请输入贴吧名") begin = int(input("输入起始页")) end = int(input("请输入终止页")) kw={'kw':name} kw=urllib.parse.urlencode(kw) for i in range(begin,end+1): pn=(i-1)*50 url = 'http://tieba.baidu.com/f?'+kw+'&pn='+str(pn) print("正在爬取第%d页" % i) #发送请求 req = urllib.request.Request(url,headers=headers) res = urllib.request.urlopen(req) time.sleep(3) html = res.read().decode('utf-8') #写入文件 filename=name + '第'+str(i)+'页.html' with open(filename,'w',encoding='utf-8') as f: f.write(html) print("已经爬取完第%d页"%i) print('*'*15) print('爬取结束')