速学爬虫
爬虫前奏
爬虫实例:
1.搜索引擎(百度、谷歌、360搜索等)。
2.伯乐在线。
3.惠惠购物助手。
4.数据分析与研究(数据冰山知乎专栏)。
5.抢票软件等。
什么是网络爬虫:
1.通俗理解:爬虫是一个模拟人类请求网站行为的程序,可以自动请求网页、并将数据抓取下来,然后使用一定的规则提取有价值的数据。
2.专业介绍:百度百科。
通用爬虫和聚焦爬虫:
1.通用爬虫:通用爬虫是搜索引擎抓取系统(百度、谷歌、搜狗等)的重要组成部分。主要是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。
2.聚焦爬虫:是面向特定需求的一种网络爬虫程序,他与通用爬虫的区别在于:聚焦爬虫在实施网页抓取的时候会对内容进行筛选和处理,尽量保证只抓取与需求相关的网页信息。
为什么用python写爬虫程序:
1.PHP:PHP大多用于网页开发,对多线程、异步支持不是很好,并发处理能力弱。爬虫是工具性程序,对速度和效率要求比较高。
2.Java:生态圈很完善,是python爬虫最大的竞争对手。但Java语言本身很笨重,代码量很大,重构成本比较高,任何修改会导致代码大量改动,而爬虫经常要修改采集代码。
3.C/C++:运行效率是无敌的,但学习和开发成本高,写爬虫程序可能要很长时间。
4.python:语法优美、海马简洁、开发效率高、支持的模块多。相关的HTTP请求模块和HTML解析模块非常丰富。还有Scrapy和Scrapy-redis框架让我们开发爬虫变得异常简单。
准备工具:
1.python3.6开发环境。
2.pycharm 2017 professional版。
3.虚拟环境“virtualenv/virtualenvwrapper”。
http协议和chrome抓包工具:
什么是http和https协议:
HTTP协议:全称是HyperText Transfer Protocal,中文意思是超文本传输协议,是一种发布和接受HTML页面的方法。服务器端口号是80端口。
HTTPS协议:是HTTP协议的加密版本,在HTTP下加入了SSL层,服务器端口号是443端口。
在浏览器中发送一个http请求的过程:
1.当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向HTTP服务器发送HTTP请求,HTTP请求主要分为“get”和“post”两种方法。
2.当我们在浏览器输入URL http://www.baidu.com 的时候,浏览器发送一个request请求去截获 http://www.baidu.com 的html文件,服务器把request文件对象发送回给浏览器。
3.浏览器分析request中的html,发现其中引用了很多其他文件,比如lmages文件,css文件,js文件。浏览器会自动再次发送request去获取图片,css文件,或者js文件。
4.当所有的文件都下载成功后,网页会根据HTML语法结构完整的显示出来。
url详解:
url是统一资源定位符。
一个url由以下几部分组成:scheme://host:port/path/?query-string=xxx#anchor
scheme:代表的是访问的协议,一般为http或者http以及ftp等。
host:主机名、域名。
port:端口号。访问网站时,浏览器默认使用80端口。
path:查找路径。
query-string:查询字符串。
anchor:锚点,后台一般不用管,前端用来做页面定位。
在浏览器中请求一个url,浏览器会对这个url进行一个编码,除英文字母、数字和部分符号外,其他的全部使用百分号+十六进制码值进行编码。
常用的请求方法:
在http协议中,定义了8种请求方法。常用两种:get请求和post请求。
get请求:请求指定的页面信息,并返回实体主体。只从服务器获取数据,并不会对服务器资源产生任何影响。
post请求:向指定资源提交数据进行处理请求,数据包含在请求体中,POST请求可能会导致新的资源的建立或已有资源的修改。
请求头常见参数:
1.user-agent 2.referer 3.cookie
常见响应状态码:
1.200:请求正常,服务器正常的返回数据。
2.301:永久重定向。
3.302:临时重定向。
4.400:请求的url在服务器上找不到。
5.403:服务器拒绝访问,权限不够。
6.500:服务区内部错误。
chrome抓包工具:
chrome浏览器是一个非常亲近开发者的浏览器。可以方便的查看网络请求以及发送的参数。
Urllib库:
最基本的网络请求库,可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保证服务器返回的数据。
urlopen函数:
在python3的urllib库中,所有和网络请求相关的方法,都被集到urllib.requset模块下面
from urllib import request resp = request.urlopen('http://www.baidu.com') print(resp.read())
实际上,使用浏览器访问百度,右键查看源代码。
1.url:请求的url。
2.data:请求的data,如果设置了这个值,那么将变成post请求。
3.返回值:返回值是一个http:client.HTTPResponse对象,这个对象是一个人类文件句柄对象。
有read(size),readline、readlines以及getcode等方法。
urlretrieve函数:
这个函数可以方便的将网页上的一个文件保存到本地。以下代码可以非常方便的将百度的首页下载到本地:
from urllib import request request.urlretrieve('http://www.baidu.com','baidu .html')
urlencode函数:
用浏览器发送请求的时候,如果url中包含了中文或者其他特殊字符,那么浏览器会自动的给我们进行编码。而如果使用代码发送请求,那么就必须手动进行编码,这时候就应该使用urlencode函数来实现。urlencode可以把字典数据转换为url编码的数据:
from urllib import request data = {'name':'爬虫基础','greet':'hello world','age':100} qs = parse.urlencode(data) print(qs)
parse_qs函数:
可以将经过编码后的url参数进行编码:
from urllib import parse qs = "name=%E7%88%AC%E8%99%AB%E5%9F%8A%E7%A1%80&greet=hello+world&age=100" print(parse.parse_qs(qs))
urlparse和urlsplit: