定义
网络蜘蛛、网络机器人,抓取网络数据的程序。
其实就是用Python程序模仿人点击浏览器并访问网站,而且模仿的越逼真越好。
爬取数据目的
获取大量数据,用来做数据分析
公司项目的测试数据,公司业务所需数据
企业获取数据方式
1、公司自有数据
2、第三方数据平台购买(数据堂、贵阳大数据交易所)
3、爬虫爬取数据 : 第三方平台上没有,或者价格太高
Python做爬虫优势
1、Python :请求模块、解析模块丰富成熟,强大的Scrapy网络爬虫框架
2、PHP :对多线程、异步支持不太好
3、JAVA:代码笨重,代码量大
4、C/C++:虽然效率高,但是代码成型慢
爬虫分类
1、# 通用网络爬虫(搜索引擎使用,遵守robots协议)
robots协议 :网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,
通用网络爬虫需要遵守robots协议(君子协议)
https://www.taobao.com/robots.txt
2、# 聚焦网络爬虫 :自己写的爬虫程序
爬虫爬取数据步骤
1、确定需要爬取的URL地址
2、由请求模块向URL地址发出请求,并得到网站的响应
3、从响应内容中提取所需数据
1、所需数据,保存
2、页面中有其他需要继续跟进的URL地址,继续第2步去发请求,如此循环
模块名及导入urllib.request
1、模块名:urllib.request
2、导入方式:
1、import urllib.request 2、from urllib import request
3.使用方法:
req = request.Request(url,headers=headers) res = request.urlopen(req) html = res.read().decode('utf-8')
常用方法详解
urllib.request.urlopen()方法
作用
向网站发起请求并获取响应对象
参数
1、URL:需要爬取的URL地址
2、timeout: 设置等待超时时间,指定时间内未得到响应抛出超时异常
响应对象(response)方法
1、bytes = response.read()
2、string = response.read().decode('utf-8')
3、url = response.geturl() # 返回实际数据的URL地址
4、code = response.getcode() # HTTP响应码
# 补充
5、string.encode() # string -> bytes
6、bytes.decode() # bytes -> string
urllib.request.Request()
作用
创建请求对象(包装请求,重构User-Agent,使程序更像正常人类请求)
参数
1、URL:请求的URL地址
2、headers:添加请求头(爬虫和反爬虫斗争的第一步)
使用流程
1、构造请求对象(重构User-Agent)
req = urllib.request.Request(url=url,headers={'User-Agent':'Mozilla/5.0 xxxx'})
2、发请求获取响应对象(urlopen)
res = urllib.request.urlopen(req)
3、获取响应对象内容
html = res.read().decode('utf-8')
示例:向测试网站发起请求,构造请求头并从响应中确认请求头信息
headers = {'User-Agent':'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)'}
模块名
urllib.parse
作用
给URL地址中查询参数进行编码
编码前:百度安全验证 编码后:百度安全验证
常用方法
1、urlencode({dict})
urlencode({'wd':'美女','pn':'20'}) #编码后 :'wd=%E8%D5XXX&pn=20'
2、quote(string)
quote('织女') #编码后 :'%D3%F5XXX' unquote('%D3%F5XXX') #解码后:织女
使用方法:
from urllib import parse #-----------urlencode({dict})编码----------------- query_string = {'wd' : '美女'} result = parse.urlencode(query_string) # result: 'wd=%e7%be%8e%e5%a5%b3' #----------quote(string)编码------------------ string = '美女' print(parse.quote(string)) # 结果: %E7%BE%8E%E5%A5%B3 #----------unquote(string)解码---------------- string = '%E7%BE%8E%E5%A5%B3' result = parse.unquote(string) print(result)
拼接URL地址的3种方式
1、字符串相加
'百度安全验证 + urlencode({'wd':'美女','pn':'50'})
2、字符串格式化(占位符)
'百度安全验证' % urlencode({'wd':'美女','pn':'50'})
3、format()方法
'百度安全验证}'.format(urlencode({'wd':'美女','pn':'50'}))
总结
1、urllib.request
urllib.request.Request(url=url,headers=headers) urllib.request.urlopen(req)
2、urllib.parse
urllib.parse.urlencode({'wd':'美女'}) urllib.parse.quote('美女')
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!