一:引子??????
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
所以,使用爬虫的人,是不是可以被叫做Spider_Man!!!hhhhh
#1、什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样。 #2、互联网建立的目的? 互联网的核心价值在于数据的共享/传递:数据是存放于一台台计算机上的,而将计算机互联到一起的目的就是为了能够方便彼此之间的数据共享/传递,否则你只能拿U盘去别人的计算机上拷贝数据了。 #3、什么是上网?爬虫要做的是什么? 我们所谓的上网便是由用户端计算机发送请求给目标计算机,将目标计算机的数据下载到本地的过程。 #3.1 只不过,用户获取网络数据的方式是: 浏览器提交请求->下载网页代码->解析/渲染成页面。 #3.2 而爬虫程序要做的就是: 模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中 #3.1与3.2的区别在于: 我们的爬虫程序只提取网页代码中对我们有用的数据 #4、总结爬虫 #4.1 爬虫的比喻: 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的猎物/数据 #4.2 爬虫的定义: 向网站发起请求,获取资源后分析并提取有用数据的程序 #4.3 爬虫的价值: 互联网中最有价值的便是数据,比如天猫商城的商品信息,链家网的租房信息,雪球网的证券投资信息等等,这些数据都代表了各个行业的真金白银,可以说,谁掌握了行业内的第一手数据,谁就成了整个行业的主宰,如果把整个互联网的数据比喻为一座宝藏,那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏,掌握了爬虫技能,你就成了所有互联网信息公司幕后的老板,换言之,它们都在免费为你提供有价值的数据。
二:流程
爬虫程序的日常流程:
模拟浏览器发送请求 --> 下载网页代码 --> 提取你乐意提取的数据 --> 存放于数据库或文件中。
通过流程图,我们要知道。
爬虫基本依赖的几个库。
首先:你发送HTTP请求,获取响应内容是不是要有一个 请求相关的库。
其次:你拿到数据要解析吧,如果这时候来个解析库来帮助我们,会不会美滋滋。
最后:解析完成了,你要不要存一下下,方便下次观阅。存储库。
#1、发起请求 使用http库向目标站点发起请求,即发送一个Request Request包含:请求头、请求体等 #2、获取响应内容 如果服务器能正常响应,则会得到一个Response Response包含:html,json,图片,视频等 #3、解析内容 解析html数据:正则表达式,第三方解析库如Beautifulsoup,pyquery等 解析json数据:json模块 解析二进制数据:以b的方式写入文件 #4、保存数据 数据库 文件
三:请求与响应
#http协议:http://www.cnblogs.com/ugfly/ #Request:用户将自己的信息通过浏览器(socket client)发送给服务器(socket server) #Response:服务器接收请求,分析用户发来的请求信息,然后返回数据(返回的数据中可能包含其他链接,如:图片,js,css等) #ps:浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,是要提取其中的有用数据。
四:Request & Response
About Request:
#1、请求方式: 常用的请求方式:GET,POST 其他请求方式:HEAD,PUT,DELETE,OPTHONS 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
自己的总结:
- 请求Reuqest
- 关于url
- get请求,会把数据放在URL后面,以?区分
- 请求头:
- cookie:模拟用户
- User-Agent:浏览器相关
- Referer:跳转之前的网址
- url中:
- 涉及一个编码问题
- 响应Response
- 响应的状态码:
- 200:成功,
- 302:重定向,
- 400:客户端问题,
- 500:服务端问题)
- 补充:
- 如果状态码是302,响应头里面会有一个localtion
- 302,说明页面已经重定向。要获得重定向的网址。
- 响应体
- html
- json
- 二进制:图片和视频
About Response:
#1、响应状态 200:代表成功 301:代表跳转 404:文件不存在 403:权限 502:服务器错误 #2、Respone header set-cookie:可能有多个,是来告诉浏览器,把cookie保存下来 #3、preview就是网页源代码 最主要的部分,包含了请求资源的内容 如网页html,图片 二进制数据等
今日份总结
#1、总结爬虫流程: 爬取--->解析--->存储 #2、爬虫所需工具: 请求库:requests,selenium 解析库:正则,beautifulsoup,pyquery 存储库:文件,mysql,Mongodb,Redis #3、爬虫常用框架: scrapy
你以为这就结束了吗???
其实,这才刚刚开始:??????
先来认识一下Requests库。
Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。
关于requests的种种用法:
requests.get(url, params=None, **kwargs) requests.post(url, data=None, json=None, **kwargs) requests.put(url, data=None, **kwargs) requests.head(url, **kwargs) requests.delete(url, **kwargs) requests.patch(url, data=None, **kwargs) requests.options(url, **kwargs) # 以上方法均是在此方法的基础上构建 requests.request(method, url, **kwargs)
关于requests模块的源代码:
它都支持什么参数,都在里面。
我干了,你随意。
def request(method, url, **kwargs): """Constructs and sends a :class:`Request <Request>`. :param method: method for the new :class:`Request` object. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param json: (optional) json data to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. :param files: (optional) Dictionary of ``‘name‘: file-like-objects`` (or ``{‘name‘: (‘filename‘, fileobj)}``) for multipart encoding upload. :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. :param timeout: (optional) How long to wait for the server to send data before giving up, as a float, or a :ref:`(connect timeout, read timeout) <timeouts>` tuple. :type timeout: float or tuple :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed. :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. :param verify: (optional) whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to ``True``. :param stream: (optional) if ``False``, the response content will be immediately downloaded. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, (‘cert‘, ‘key‘) pair. :return: :class:`Response <Response>` object :rtype: requests.Response Usage:: >>> import requests >>> req = requests.request(‘GET‘, ‘http://httpbin.org/get‘) <Response [200]> """ # By using the ‘with‘ statement we are sure the session is closed, thus we # avoid leaving sockets open which can trigger a ResourceWarning in some # cases, and look like a memory leak in others. with sessions.Session() as session: return session.request(method=method, url=url, **kwargs)
??????
如果还想查看更多关于requests模块
相关的文档见:http://cn.python-requests.org/zh_CN/latest/