<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Spider on 中二青年</title>
    <link>https://zhong-er.com/categories/spider/</link>
    <description>Recent content in Spider on 中二青年</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 03 Dec 2019 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://zhong-er.com/categories/spider/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>【爬虫】存储库之MongoDB</title>
      <link>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E5%AD%98%E5%82%A8%E5%BA%93%E4%B9%8Bmongodb/</link>
      <pubDate>Tue, 03 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E5%AD%98%E5%82%A8%E5%BA%93%E4%B9%8Bmongodb/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;爬虫.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009031721_5943.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;一-简介&#34;&gt;一 简介&lt;/h3&gt;
&lt;p&gt;MongoDB是一款强大、灵活、且易于扩展的通用型数据库&lt;br&gt;
1、易用性&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MongoDB是一个面向文档（document-oriented）的数据库，而不是关系型数据库。
不采用关系型主要是为了获得更好得扩展性。当然还有一些其他好处，与关系数据库相比，面向文档的数据库不再有“行“（row）的概念取而代之的是更为灵活的“文档”（document）模型。
通过在文档中嵌入文档和数组，面向文档的方法能够仅使用一条记录来表现复杂的层级关系，这与现代的面向对象语言的开发者对数据的看法一致。
另外，不再有预定义模式（predefined schema）：文档的键（key）和值（value）不再是固定的类型和大小。由于没有固定的模式，根据需要添加或删除字段变得更容易了。通常由于开发者能够进行快速迭代，所以开发进程得以加快。而且，实验更容易进行。开发者能尝试大量的数据模型，从中选一个最好的。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2、易扩展性&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;应用程序数据集的大小正在以不可思议的速度增长。随着可用带宽的增长和存储器价格的下降，即使是一个小规模的应用程序，需要存储的数据量也可能大的惊人，甚至超出
了很多数据库的处理能力。过去非常罕见的T级数据，现在已经是司空见惯了。
由于需要存储的数据量不断增长，开发者面临一个问题：应该如何扩展数据库，分为纵向扩展和横向扩展，纵向扩展是最省力的做法，但缺点是大型机一般都非常贵，而且
当数据量达到机器的物理极限时，花再多的钱也买不到更强的机器了，此时选择横向扩展更为合适，但横向扩展带来的另外一个问题就是需要管理的机器太多。
MongoDB的设计采用横向扩展。面向文档的数据模型使它能很容易地在多台服务器之间进行数据分割。MongoDB能够自动处理跨集群的数据和负载，自动重新分配文档，以及将
用户的请求路由到正确的机器上。这样，开发者能够集中精力编写应用程序，而不需要考虑如何扩展的问题。如果一个集群需要更大的容量，只需要向集群添加新服务器，MongoDB就会自动将现有的数据向新服务器传送
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3、丰富的功能&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MongoDB作为一款通用型数据库，除了能够创建、读取、更新和删除数据之外，还提供了一系列不断扩展的独特功能
#1、索引
支持通用二级索引，允许多种快速查询，且提供唯一索引、复合索引、地理空间索引、全文索引

#2、聚合
支持聚合管道，用户能通过简单的片段创建复杂的集合，并通过数据库自动优化

#3、特殊的集合类型
支持存在时间有限的集合，适用于那些将在某个时刻过期的数据，如会话session。类似地，MongoDB也支持固定大小的集合，用于保存近期数据，如日志

#4、文件存储
支持一种非常易用的协议，用于存储大文件和文件元数据。MongoDB并不具备一些在关系型数据库中很普遍的功能，如链接join和复杂的多行事务。省略
这些的功能是处于架构上的考虑，或者说为了得到更好的扩展性，因为在分布式系统中这两个功能难以高效地实现
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4、卓越的性能&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MongoDB的一个主要目标是提供卓越的性能，这很大程度上决定了MongoDB的设计。MongoDB把尽可能多的内存用作缓存cache，视图为每次查询自动选择正确的索引。
总之各方面的设计都旨在保持它的高性能
虽然MongoDB非常强大并试图保留关系型数据库的很多特性，但它并不追求具备关系型数据库的所有功能。只要有可能，数据库服务器就会将处理逻辑交给客户端。这种精简方式的设计是MongoDB能够实现如此高性能的原因之一
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;二-mongodb基础知识&#34;&gt;二 MongoDB基础知识&lt;/h3&gt;
&lt;p&gt;&lt;img alt=&#34;MongoDB.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912038079_6347.png-zhonger.com&#34;&gt;1、文档是MongoDB的核心概念。文档就是键值对的一个有序集{&amp;lsquo;msg&amp;rsquo;:&amp;lsquo;hello&amp;rsquo;,&amp;lsquo;foo&amp;rsquo;:3}。类似于python中的有序字典。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;需要注意的是：
#1、文档中的键/值对是有序的。
#2、文档中的值不仅可以是在双引号里面的字符串，还可以是其他几种数据类型（甚至可以是整个嵌入的文档)。
#3、MongoDB区分类型和大小写。
#4、MongoDB的文档不能有重复的键。
#5、文档中的值可以是多种不同的数据类型，也可以是一个完整的内嵌文档。文档的键是字符串。除了少数例外情况，键可以使用任意UTF-8字符。

文档键命名规范：
#1、键不能含有\0 (空字符)。这个字符用来表示键的结尾。
#2、.和$有特别的意义，只有在特定环境下才能使用。
#3、以下划线&amp;quot;_&amp;quot;开头的键是保留的(不是严格要求的)。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2、集合就是一组文档。如果将MongoDB中的一个文档比喻为关系型数据的一行，那么一个集合就是相当于一张表&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#1、集合存在于数据库中，通常情况下为了方便管理，不同格式和类型的数据应该插入到不同的集合，但其实集合没有固定的结构，这意味着我们完全可以把不同格式和类型的数据统统插入一个集合中。

#2、组织子集合的方式就是使用“.”，分隔不同命名空间的子集合。
比如一个具有博客功能的应用可能包含两个集合，分别是blog.posts和blog.authors，这是为了使组织结构更清晰，这里的blog集合（这个集合甚至不需要存在）跟它的两个子集合没有任何关系。
在MongoDB中，使用子集合来组织数据非常高效，值得推荐

#3、当第一个文档插入时，集合就会被创建。合法的集合名：
集合名不能是空字符串&amp;quot;&amp;quot;。
集合名不能含有\0字符（空字符)，这个字符表示集合名的结尾。
集合名不能以&amp;quot;system.&amp;quot;开头，这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含，这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合，否则千万不要在名字里出现$。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3、数据库：在MongoDB中，多个文档组成集合，多个集合可以组成数据库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串：
#1、不能是空字符串（&amp;quot;&amp;quot;)。
#2、不得含有&#39; &#39;（空格)、.、$、/、\和\0 (空字符)。
#3、应全部小写。
#4、最多64字节。

有一些数据库名是保留的，可以直接访问这些有特殊作用的数据库。
#1、admin： 从身份认证的角度讲，这是“root”数据库，如果将一个用户添加到admin数据库，这个用户将自动获得所有数据库的权限。再者，一些特定的服务器端命令也只能从admin数据库运行，如列出所有数据库或关闭服务器
#2、local: 这个数据库永远都不可以复制，且一台服务器上的所有本地集合都可以存储在这个数据库中
#3、config: MongoDB用于分片设置时，分片信息会存储在config数据库中
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4、强调：把数据库名添加到集合名前，得到集合的完全限定名，即命名空间&lt;/p&gt;</description>
    </item>
    <item>
      <title>【爬虫】高性能相关</title>
      <link>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E9%AB%98%E6%80%A7%E8%83%BD%E7%9B%B8%E5%85%B3/</link>
      <pubDate>Tue, 03 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E9%AB%98%E6%80%A7%E8%83%BD%E7%9B%B8%E5%85%B3/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;爬虫.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009031721_5943.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;一-背景知识&#34;&gt;一 背景知识&lt;/h3&gt;
&lt;p&gt;爬虫的本质就是一个socket客户端与服务端的通信过程，如果我们有多个url待爬取，只用一个线程且采用串行的方式执行，那只能等待爬取一个结束后才能继续下一个，效率会非常低。&lt;/p&gt;
&lt;p&gt;需要强调的是：对于单线程下串行N个任务，并不完全等同于低效，如果这N个任务都是纯计算的任务，那么该线程对cpu的利用率仍然会很高，之所以单线程下串行多个爬虫任务低效，是因为爬虫任务是明显的IO密集型程序。&lt;/p&gt;
&lt;p&gt;关于IO模型详见&lt;a href=&#34;http://www.cnblogs.com/linhaifeng/articles/7454717.html&#34;&gt;链接：http://www.cnblogs.com/linhaifeng/articles/7454717.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;那么该如何提高爬取性能呢？且看下述概念&lt;/p&gt;
&lt;h3 id=&#34;二-同步异步回调机制&#34;&gt;二 同步、异步、回调机制&lt;/h3&gt;
&lt;p&gt;1、同步调用：即提交一个任务后就在原地等待任务结束，等到拿到任务的结果后再继续下一行代码，效率低下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 同步调用

import requests

def parse_page(res):
    print(&#39;解析 %s&#39; %(len(res)))

def get_page(url):
    print(&#39;下载 %s&#39; %url)
    response=requests.get(url)
    if response.status_code == 200:
        return response.text

urls=[&#39;https://www.baidu.com/&#39;,&#39;http://www.sina.com.cn/&#39;,&#39;https://www.python.org&#39;]
for url in urls:
    res=get_page(url) #调用一个任务，就在原地等待任务结束拿到结果后才继续往后执行
    parse_page(res)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2、一个简单的解决方案：多线程或多进程&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#在服务器端使用多线程（或多进程）。多线程（或多进程）的目的是让每个连接都拥有独立的线程（或进程），这样任何一个连接的阻塞都不会影响其他的连接。


# 多进程或多线程

#IO密集型程序应该用多线程
import requests
from threading import Thread,current_thread

def parse_page(res):
    print(&#39;%s 解析 %s&#39; %(current_thread().getName(),len(res)))

def get_page(url,callback=parse_page):
    print(&#39;%s 下载 %s&#39; %(current_thread().getName(),url))
    response=requests.get(url)
    if response.status_code == 200:
        callback(response.text)

if __name__ == &#39;__main__&#39;:
    urls=[&#39;https://www.baidu.com/&#39;,&#39;http://www.sina.com.cn/&#39;,&#39;https://www.python.org&#39;]
    for url in urls:
        t=Thread(target=get_page,args=(url,))
        t.start()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该方案的问题是：&lt;/p&gt;</description>
    </item>
    <item>
      <title>【爬虫】解析库之beautifulsoup库</title>
      <link>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E8%A7%A3%E6%9E%90%E5%BA%93%E4%B9%8Bbeautifulsoup%E5%BA%93/</link>
      <pubDate>Tue, 03 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E8%A7%A3%E6%9E%90%E5%BA%93%E4%B9%8Bbeautifulsoup%E5%BA%93/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;爬虫.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009031721_5943.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;一-介绍&#34;&gt;一 介绍&lt;/h3&gt;
&lt;p&gt;Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.你可能在寻找 Beautiful Soup3 的文档,Beautiful Soup 3 目前已经停止开发,官网推荐在现在的项目中使用Beautiful Soup 4, 移植到BS4&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#安装 Beautiful Soup
pip install beautifulsoup4

#安装解析器
Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml .根据操作系统不同,可以选择下列方法来安装lxml:

$ apt-get install Python-lxml

$ easy_install lxml

$ pip install lxml

另一个可供选择的解析器是纯Python实现的 html5lib , html5lib的解析方式与浏览器相同,可以选择下列方法来安装html5lib:

$ apt-get install Python-html5lib

$ easy_install html5lib

$ pip install html5lib
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下表列出了主要的解析器,以及它们的优缺点,官网推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;jiexiqi.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912036355_4097.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html&#34;&gt;中文文档：https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;二-基本使用&#34;&gt;二 基本使用&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;html_doc = &amp;quot;&amp;quot;&amp;quot;
&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;The Dormouse&#39;s story&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;p class=&amp;quot;title&amp;quot;&amp;gt;&amp;lt;b&amp;gt;The Dormouse&#39;s story&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p class=&amp;quot;story&amp;quot;&amp;gt;Once upon a time there were three little sisters; and their names were
&amp;lt;a href=&amp;quot;http://example.com/elsie&amp;quot; class=&amp;quot;sister&amp;quot; id=&amp;quot;link1&amp;quot;&amp;gt;Elsie&amp;lt;/a&amp;gt;,
&amp;lt;a href=&amp;quot;http://example.com/lacie&amp;quot; class=&amp;quot;sister&amp;quot; id=&amp;quot;link2&amp;quot;&amp;gt;Lacie&amp;lt;/a&amp;gt; and
&amp;lt;a href=&amp;quot;http://example.com/tillie&amp;quot; class=&amp;quot;sister&amp;quot; id=&amp;quot;link3&amp;quot;&amp;gt;Tillie&amp;lt;/a&amp;gt;;
and they lived at the bottom of a well.&amp;lt;/p&amp;gt;

&amp;lt;p class=&amp;quot;story&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;
&amp;quot;&amp;quot;&amp;quot;

#基本使用：容错处理,文档的容错能力指的是在html代码不完整的情况下,使用该模块可以识别该错误。使用BeautifulSoup解析上述代码,能够得到一个 BeautifulSoup 的对象,并能按照标准的缩进格式的结构输出
from bs4 import BeautifulSoup
soup=BeautifulSoup(html_doc,&#39;lxml&#39;) #具有容错功能
res=soup.prettify() #处理好缩进，结构化显示
print(res)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;三-遍历文档树&#34;&gt;三 遍历文档树&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#遍历文档树：即直接通过标签名字选择，特点是选择速度快，但如果存在多个相同的标签则只返回第一个
#1、用法
#2、获取标签的名称
#3、获取标签的属性
#4、获取标签的内容
#5、嵌套选择
#6、子节点、子孙节点
#7、父节点、祖先节点
#8、兄弟节点


#遍历文档树：即直接通过标签名字选择，特点是选择速度快，但如果存在多个相同的标签则只返回第一个
html_doc = &amp;quot;&amp;quot;&amp;quot;
&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;The Dormouse&#39;s story&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;p id=&amp;quot;my p&amp;quot; class=&amp;quot;title&amp;quot;&amp;gt;&amp;lt;b id=&amp;quot;bbb&amp;quot; class=&amp;quot;boldest&amp;quot;&amp;gt;The Dormouse&#39;s story&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p class=&amp;quot;story&amp;quot;&amp;gt;Once upon a time there were three little sisters; and their names were
&amp;lt;a href=&amp;quot;http://example.com/elsie&amp;quot; class=&amp;quot;sister&amp;quot; id=&amp;quot;link1&amp;quot;&amp;gt;Elsie&amp;lt;/a&amp;gt;,
&amp;lt;a href=&amp;quot;http://example.com/lacie&amp;quot; class=&amp;quot;sister&amp;quot; id=&amp;quot;link2&amp;quot;&amp;gt;Lacie&amp;lt;/a&amp;gt; and
&amp;lt;a href=&amp;quot;http://example.com/tillie&amp;quot; class=&amp;quot;sister&amp;quot; id=&amp;quot;link3&amp;quot;&amp;gt;Tillie&amp;lt;/a&amp;gt;;
and they lived at the bottom of a well.&amp;lt;/p&amp;gt;

&amp;lt;p class=&amp;quot;story&amp;quot;&amp;gt;...&amp;lt;/p&amp;gt;
&amp;quot;&amp;quot;&amp;quot;

#1、用法
from bs4 import BeautifulSoup
soup=BeautifulSoup(html_doc,&#39;lxml&#39;)
# soup=BeautifulSoup(open(&#39;a.html&#39;),&#39;lxml&#39;)

print(soup.p) #存在多个相同的标签则只返回第一个
print(soup.a) #存在多个相同的标签则只返回第一个

#2、获取标签的名称
print(soup.p.name)

#3、获取标签的属性
print(soup.p.attrs)

#4、获取标签的内容
print(soup.p.string) # p下的文本只有一个时，取到，否则为None
print(soup.p.strings) #拿到一个生成器对象, 取到p下所有的文本内容
print(soup.p.text) #取到p下所有的文本内容
for line in soup.stripped_strings: #去掉空白
    print(line)

&#39;&#39;&#39;
如果tag包含了多个子节点,tag就无法确定 .string 方法应该调用哪个子节点的内容, .string 的输出结果是 None，如果只有一个子节点那么就输出该子节点的文本，比如下面的这种结构，soup.p.string 返回为None,但soup.p.strings就可以找到所有文本
&amp;lt;p id=&#39;list-1&#39;&amp;gt;
    哈哈哈哈
    &amp;lt;a class=&#39;sss&#39;&amp;gt;
        &amp;lt;span&amp;gt;
            &amp;lt;h1&amp;gt;aaaa&amp;lt;/h1&amp;gt;
        &amp;lt;/span&amp;gt;
    &amp;lt;/a&amp;gt;
    &amp;lt;b&amp;gt;bbbbb&amp;lt;/b&amp;gt;
&amp;lt;/p&amp;gt;
&#39;&#39;&#39;

#5、嵌套选择
print(soup.head.title.string)
print(soup.body.a.string)

#6、子节点、子孙节点
print(soup.p.contents) #p下所有子节点
print(soup.p.children) #得到一个迭代器,包含p下所有子节点

for i,child in enumerate(soup.p.children):
    print(i,child)

print(soup.p.descendants) #获取子孙节点,p下所有的标签都会选择出来
for i,child in enumerate(soup.p.descendants):
    print(i,child)

#7、父节点、祖先节点
print(soup.a.parent) #获取a标签的父节点
print(soup.a.parents) #找到a标签所有的祖先节点，父亲的父亲，父亲的父亲的父亲...

#8、兄弟节点
print(&#39;=====&amp;gt;&#39;)
print(soup.a.next_sibling) #下一个兄弟
print(soup.a.previous_sibling) #上一个兄弟

print(list(soup.a.next_siblings)) #下面的兄弟们=&amp;gt;生成器对象
print(soup.a.previous_siblings) #上面的兄弟们=&amp;gt;生成器对象
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;四-搜索文档树&#34;&gt;四 搜索文档树&lt;/h3&gt;
&lt;p&gt;1、五种过滤器&lt;/p&gt;</description>
    </item>
    <item>
      <title>数据分析介绍</title>
      <link>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%BB%8B%E7%BB%8D/</link>
      <pubDate>Mon, 02 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%BB%8B%E7%BB%8D/</guid>
      <description>&lt;h3 id=&#34;sjfxjpg&#34;&gt;&lt;img alt=&#34;sjfx.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912025928_8638_1.jpg&#34;&gt;&lt;/h3&gt;
&lt;h3 id=&#34;1数据分析是什么&#34;&gt;1、数据分析是什么&lt;/h3&gt;
&lt;p&gt;在我们如今这个时代，相信大多数人都能明白数据的重要性，数据就是信息，而数据分析就是可以让我们发挥这些信息功能的重要手段。&lt;/p&gt;
&lt;h3 id=&#34;2数据分析能干什么&#34;&gt;2、数据分析能干什么&lt;/h3&gt;
&lt;p&gt;对于数据分析能干什么其实我们可以简单的举几个例子：&lt;/p&gt;
&lt;p&gt;1、淘宝可以观察用户的购买记录、搜索记录以及人们在社交媒体上发布的内容选择商品推荐&lt;/p&gt;
&lt;p&gt;2、股票可以根据相应的数据选择买进卖出&lt;/p&gt;
&lt;p&gt;3、今日头条可以将数据分析应用到新闻推送排行算法当中&lt;/p&gt;
&lt;p&gt;4、爱奇艺可以为用户提供个性化电影推荐服务&lt;/p&gt;
&lt;p&gt;其实数据分析不仅可以完成像以上这样的推荐系统，在制药行业也可运用数据分析来预测什么样的化合物更有可能制成高效药物等&lt;/p&gt;
&lt;p&gt;所以说数据分析绝对是未来所有公司不可或缺的岗位，目前社会上获取数据方式太多了，这么多的数据，只要我们拥有数据分析的技能，绝对可以应付任何岗位上的工作。&lt;/p&gt;
&lt;h3 id=&#34;3为什么利用python进行数据分析&#34;&gt;3、为什么利用Python进行数据分析&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1、Python的代码语法简单易学&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2、Python可以很容易的整合C、C++等语言的代码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3、Python有大量用于科学计算的库&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4、Python不仅可以用于研究和原型构建，同时也适用于构建生产系统&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4数据分析过程概述&#34;&gt;4、数据分析过程概述&lt;/h3&gt;
&lt;h5 id=&#34;41提出问题&#34;&gt;4.1、提出问题&lt;/h5&gt;
&lt;p&gt;在真正的工作场景下，往往我们需要的处理的是多个庞大的数据集还有可能是类型完全不同的数据，那这个时候一个准确的问题就可以让我们聚集与问题相关的那部分数据，为后续的分析操作提供一个明确的方向，帮助我们得到一个有意义的结论。&lt;/p&gt;
&lt;h5 id=&#34;42整理数据&#34;&gt;4.2、整理数据&lt;/h5&gt;
&lt;p&gt;整理数据主要分为三步：&lt;/p&gt;
&lt;p&gt;(1)、收集数据&lt;/p&gt;
&lt;p&gt;通过多种途径拿到数据，导入到&lt;code&gt;Jupyter Notebook&lt;/code&gt;中&lt;/p&gt;
&lt;p&gt;(2)、评估数据&lt;/p&gt;
&lt;p&gt;这一步主要是需要找出数据是否存在质量或者结构等方面的问题&lt;/p&gt;
&lt;p&gt;(3)、清理数据&lt;/p&gt;
&lt;p&gt;通过修改、替换、删除等方式保证数据质量高、结构好&lt;/p&gt;
&lt;h5 id=&#34;33探索性数据分析&#34;&gt;3.3、探索性数据分析&lt;/h5&gt;
&lt;p&gt;在这一步骤主要可以探索并且扩充数据&lt;/p&gt;
&lt;h5 id=&#34;44得出结论&#34;&gt;4.4、得出结论&lt;/h5&gt;
&lt;p&gt;在进行完探索性数据分析之后肯定会得出一个结果或者说是结论，这样我们就可以根据这样一个结论进行相应的操作，就比如说分析股票数据得到那个大盘趋势好可以选择买进，又或者说类似于万达这样的大型商场可以分析那种类型的商品会比较受用户的欢迎，以便针对性的存货。但是具体的操作可能就需要用到机器学习或者推断统计学来实现，这个就与数据分析不一样了&lt;/p&gt;
&lt;h5 id=&#34;45传达结果&#34;&gt;4.5、传达结果&lt;/h5&gt;
&lt;p&gt;分析的能力有多强，分析的价值就有多大。&lt;/p&gt;
&lt;p&gt;这一步主要是向其他人证明你发现的见解以及传达意义&lt;/p&gt;
&lt;h3 id=&#34;5常用库简介&#34;&gt;5、常用库简介&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Numpy&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;http://numpy.org/&#34;&gt;Numpy&lt;/a&gt;是Numerical Python的简写，主要可以用来做Python数值计算。它提供了多种数据结构、算法以及大部分涉及Python数值计算所需的接口。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;快速、高效的多维数组对象ndarray&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;基于元素的数组计算以及直接对数组执行数学运算的函数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用于读写硬盘上基于数组的数据集的工具&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;线性代数运算、傅里叶变换，以及随机数生成&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用于将C、C++、Fortran代码集成到python的工具&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Pandas&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pandas使我们进行数据分析的一个主要工具。它所包含的数据结构和数据处理工具的设计使得Python中进行数据清洗和分析非常快捷。pandas一般也是和其他数值计算工具一起使用的，支持大部分Numpy语言风格的数组计算。pandas和numpy最大的区别就是pandas是用来处理表格型或者异质性数据的，而Numpy则刚好相反，它更适合处理同质型的数值类数组数据&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;matplotlib&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;matplotlib是最流行的用于绘制数据图表的python库。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Scipy&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Scipy是科学计算领域针对不同标准问题域的包集合。提供了强大的科学计算方法（矩阵分析、信号分析、数理分析等）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;IPython和Juypyter notebook&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;IPython是一个加强版的Python解释器，Juypyter notebook是一种基于Web的代码笔记本，最初也是源于IPython项目。&lt;/p&gt;</description>
    </item>
    <item>
      <title>数据分析开发环境部署</title>
      <link>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2/</link>
      <pubDate>Mon, 02 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;anaconda.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912027338_91_1.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;1anaconda&#34;&gt;1、Anaconda&lt;/h3&gt;
&lt;p&gt;Anaconda是Python的一个开源的发行版本，里面包含了很多科学计算相关的包，它和Python的关系就像linux系统中centos和Ubuntu的关系一样，不冲突，你可以同时在电脑上安装这两个东西。那至于为什么我已经在电脑上安装了pycharm还要安装这个Anaconda呢，主要有以下几点原因：&lt;/p&gt;
&lt;p&gt;（1）Anaconda附带了一大批常用数据科学包，它附带了conda、Python和 150 多个科学包及其依赖项。因此你可以用Anaconda立即开始处理数据。&lt;/p&gt;
&lt;p&gt;（2）管理包。Anaconda 是在 conda（一个包管理器和环境管理器）上发展出来的。在数据分析中，你会用到很多第三方的包，而conda（包管理器）可以很好的帮助你在计算机上安装和管理这些包，包括安装、卸载和更新包。&lt;/p&gt;
&lt;p&gt;（3）管理环境。为什么需要管理环境呢？比如你在A项目中用到了Python2，而新的项目要求使用Python3，而同时安装两个Python版本可能会造成许多混乱和错误。这时候conda就可以帮助你为不同的项目建立不同的运行环境。还有很多项目使用的包版本不同，比如不同的pandas版本，不可能同时安装两个pandas版本。你要做的应该是在项目对应的环境中创建对应的pandas版本。这时候conda就可以帮你做到。&lt;/p&gt;
&lt;p&gt;总结：Anaconda解决了官方Python的两大痛点：&lt;/p&gt;
&lt;p&gt;（1）提供了包管理功能，Windows平台安装第三方包经常失败的场景得以解决&lt;/p&gt;
&lt;p&gt;（2）提供环境管理功能，解决了多版本Python并存、切换的问题。&lt;/p&gt;
&lt;p&gt;接下来就需要了解Anaconda如何进行安装&lt;/p&gt;
&lt;h3 id=&#34;2下载&#34;&gt;2、下载&lt;/h3&gt;
&lt;h5 id=&#34;anaconda下载入口&#34;&gt;&lt;a href=&#34;https://www.anaconda.com/distribution/#download-section&#34;&gt;Anaconda下载入口&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;&lt;img alt=&#34;anacondaxz.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201912025238_1946.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;按照上面的路径点击下载，下载完成后就可以一路点击下一步完成安装，如果中间需要修改安装路径可以自己改一下。安装成功之后我们会发现，多出来几个应用&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Anaconda Navigtor ：用于管理工具包和环境的图形用户界面，后续涉及的众多管理命令也可以在 Navigator 中手工实现。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jupyter notebook ：基于web的交互式计算环境，可以编辑易于人们阅读的文档，用于展示数据分析的过程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;qtconsole ：一个可执行 IPython 的仿终端图形界面程序，相比 Python Shell 界面，qtconsole 可以直接显示代码生成的图形，实现多行代码输入执行，以及内置许多有用的功能和函数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;spyder ：一个使用Python语言、跨平台的、科学运算集成开发环境。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;那以上应用我们简单了解一下就好，不需要管。&lt;/p&gt;
&lt;h3 id=&#34;3配置环境变量&#34;&gt;3、配置环境变量&lt;/h3&gt;
&lt;h5 id=&#34;31windows-系统&#34;&gt;3.1、windows 系统&lt;/h5&gt;
&lt;p&gt;如果是Windows环境的话就需要在&lt;code&gt;控制面板\系统和安全\系统\高级系统设置\环境变量\用户变量\PATH&lt;/code&gt;当中添加anaconda的安装目录的Scripts文件夹。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;验证：&lt;br&gt;
打开命令行输入conda &amp;ndash;version，如果能输出版本号就对了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5 id=&#34;32mac系统&#34;&gt;3.2、Mac系统&lt;/h5&gt;
&lt;p&gt;在终端输入以下命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export PATH=~/anaconda/bin:$PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;4管理包&#34;&gt;4、管理包&lt;/h3&gt;
&lt;p&gt;在anaconda当中虽然已经存在了很多科学计算的包，但是我们总有需要安装新的包的需求，有了anaconda就可以很好地管理这些包了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 管理包在Python解释器中有pip，在anaconda中conda，它的功能和pip是一样的，在anaconda中选择pip也是可以安装包的
1、安装包
conda install requests
2、卸载包
conda remove requests
3、更新包
conda update requests
4、查询已安装的包
conda list
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;5管理环境&#34;&gt;5、管理环境&lt;/h3&gt;
&lt;p&gt;可以通过conda创建不同的运行环境&lt;/p&gt;</description>
    </item>
    <item>
      <title>【爬虫】请求库之selenium库</title>
      <link>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E8%AF%B7%E6%B1%82%E5%BA%93%E4%B9%8Bselenium%E5%BA%93/</link>
      <pubDate>Fri, 29 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E8%AF%B7%E6%B1%82%E5%BA%93%E4%B9%8Bselenium%E5%BA%93/</guid>
      <description>&lt;h1 id=&#34;爬虫png&#34;&gt;&lt;img alt=&#34;爬虫.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009031721_5943.png&#34;&gt;&lt;/h1&gt;
&lt;h1 id=&#34;一介绍&#34;&gt;一、介绍&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题

selenium本质是通过驱动浏览器，完全模拟浏览器的操作，比如跳转、输入、点击、下拉等，来拿到网页渲染之后的结果，可支持多种浏览器

from selenium import webdriver
browser=webdriver.Chrome()
browser=webdriver.Firefox()
browser=webdriver.PhantomJS()
browser=webdriver.Safari()
browser=webdriver.Edge()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&#34;http://selenium-python.readthedocs.io/&#34;&gt;官网：http://selenium-python.readthedocs.io&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;二安装&#34;&gt;二、安装&lt;/h1&gt;
&lt;p&gt;1.有界面浏览器&lt;/p&gt;
&lt;p&gt;selenium+chromedriver&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#安装：selenium+chromedriver
pip3 install selenium
下载chromdriver.exe放到python安装路径的scripts目录中即可，注意最新版本是2.38，并非2.9
国内镜像网站地址：http://npm.taobao.org/mirrors/chromedriver/2.38/
最新的版本去官网找:https://sites.google.com/a/chromium.org/chromedriver/downloads

#验证安装
C:\Users\Administrator&amp;gt;python3
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type &amp;quot;help&amp;quot;, &amp;quot;copyright&amp;quot;, &amp;quot;credits&amp;quot; or &amp;quot;license&amp;quot; for more information.
&amp;gt;&amp;gt;&amp;gt; from selenium import webdriver
&amp;gt;&amp;gt;&amp;gt; driver=webdriver.Chrome() #弹出浏览器
&amp;gt;&amp;gt;&amp;gt; driver.get(&#39;https://www.baidu.com&#39;)
&amp;gt;&amp;gt;&amp;gt; driver.page_source

#注意：
selenium3默认支持的webdriver是Firfox，而Firefox需要安装geckodriver
下载链接：https://github.com/mozilla/geckodriver/releases

selenium+chromedriver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.无界面浏览器&lt;/p&gt;
&lt;p&gt;selenium+phantomjs&lt;/p&gt;
&lt;p&gt;PhantomJS不再更新&lt;/p&gt;</description>
    </item>
    <item>
      <title>【爬虫】基本原理</title>
      <link>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86/</link>
      <pubDate>Mon, 25 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;爬虫.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009031721_5943.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;一爬虫是什么&#34;&gt;一、爬虫是什么？&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;pachong.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201911253050_307.jpg&#34;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#1、什么是互联网？
    互联网是由网络设备（网线，路由器，交换机，防火墙等等）和一台台计算机连接而成，像一张网一样。

#2、互联网建立的目的？
    互联网的核心价值在于数据的共享/传递：数据是存放于一台台计算机上的，而将计算机互联到一起的目的就是为了能够方便彼此之间的数据共享/传递，否则你只能拿U盘去别人的计算机上拷贝数据了。

#3、什么是上网？爬虫要做的是什么？
    我们所谓的上网便是由用户端计算机发送请求给目标计算机，将目标计算机的数据下载到本地的过程。
    #3.1 只不过，用户获取网络数据的方式是：
      浏览器提交请求-&amp;gt;下载网页代码-&amp;gt;解析/渲染成页面。

```
#3.2 而爬虫程序要做的就是：
  模拟浏览器发送请求-&amp;gt;下载网页代码-&amp;gt;只提取有用的数据-&amp;gt;存放于数据库或文件中
　
#3.1与3.2的区别在于:
```

      我们的爬虫程序只提取网页代码中对我们有用的数据

#4、总结爬虫
    #4.1 爬虫的比喻：
      如果我们把互联网比作一张大的蜘蛛网，那一台计算机上的数据便是蜘蛛网上的一个猎物，而爬虫程序就是一只小蜘蛛，沿着蜘蛛网抓取自己想要的猎物/数据

```
#4.2 爬虫的定义：
```

      向网站发起请求，获取资源后分析并提取有用数据的程序 

```
#4.3 爬虫的价值：
  互联网中最有价值的便是数据，比如天猫商城的商品信息，链家网的租房信息，雪球网的证券投资信息等等，这些数据都代表了各个行业的真金白银，可以说，谁掌握了行业内的第一手数据，谁就成了整个行业的主宰，如果把整个互联网的数据比喻为一座宝藏，那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏，掌握了爬虫技能，你就成了所有互联网信息公司幕后的老板，换言之，它们都在免费为你提供有价值的数据。
```
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;二爬虫的基本流程&#34;&gt;二、爬虫的基本流程&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;pclc.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201911256154_6066.png&#34;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#1、发起请求
使用http库向目标站点发起请求，即发送一个Request
Request包含：请求头、请求体等

#2、获取响应内容
如果服务器能正常响应，则会得到一个Response
Response包含：html，json，图片，视频等

#3、解析内容
解析html数据：正则表达式，第三方解析库如Beautifulsoup，pyquery等
解析json数据：json模块
解析二进制数据:以b的方式写入文件

#4、保存数据
数据库
文件
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;三请求与响应&#34;&gt;三、请求与响应&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;qqyxy.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201911251408_31.png&#34;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#http协议：http://www.cnblogs.com/linhaifeng/articles/8243379.html

#Request：用户将自己的信息通过浏览器（socket client）发送给服务器（socket server）

#Response：服务器接收请求，分析用户发来的请求信息，然后返回数据（返回的数据中可能包含其他链接，如：图片，js，css等）

#ps：浏览器在接收Response后，会解析其内容来显示给用户，而爬虫程序在模拟浏览器发送请求然后接收Response后，是要提取其中的有用数据。
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;四request&#34;&gt;四、Request&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;#1、请求方式：
    常用的请求方式：GET，POST
    其他请求方式：HEAD，PUT，DELETE，OPTHONS

```
ps：用浏览器演示get与post的区别，（用登录演示post）

post与get请求最终都会拼接成这种形式：k1=xxx&amp;amp;k2=yyy&amp;amp;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 
```


from urllib.parse import urlencode
import requests

headers={
&#39;Accept&#39;:&#39;text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8&#39;,
&#39;Cookie&#39;:&#39;H_WISE_SIDS=101556_115474_115442_114743_108373_100099_115725_106201_107320_115339_114797_115553_116093_115546_115625_115446_114329_115350_114275_116040_110085; PSTM=1494300712; BAIDUID=42FE2934E37AF7AD1FA31D8CC7006D45:FG=1; BIDUPSID=2996557DB2710279BD865C50F9A68615; MCITY=-%3A; __cfduid=da9f97dea6458ca26aa4278280752ebb01508939712; BDSFRCVID=PGLsJeCCxG3wt_3ZUrBLDfv2D_qBZSjAgcEe3J; H_BDCLCKID_SF=tJAOoCLytI03qn5zq4Oh-4oHhxoJq5QxbT7Z0l8KtfcNVJQs-lCMhbtp-l3GJPoLWK6hBKQmWIQHDnbsbq0M2tcQXR5-WROCte74KKJx-4PWeIJo5tKh04JbhUJiB5OLBan7Lq7xfDDbbDtmej_3-PC3ql6354Rj2C_X3b7EfKjIOtO_bfbT2MbyeqrNQlTkLIvXoITJQD_bEP3Fbfj2DPQ3KabZqjDjJbue_I05f-oqebT4btbMqRtthf5KeJ3KaKrKW5rJabC3hPJeKU6qLT5Xjh6B5qDfyDoAbKOt-IOjhb5hMpnx-p0njxQyaR3RL2Kj0p_EWpcxsCQqLUonDh8L3H7MJUntKjnRonTO5hvvhb6O3M7-XpOhDG0fJjtJJbksQJ5e24oqHP-kKPrV-4oH5MQy5toyHD7yWCvjWlT5OR5Jj6KMjMkb3xbz2fcpMIrjob8M5CQESInv3MA--fcLD2ch5-3eQgTI3fbIJJjWsq0x0-jle-bQypoa-U0j2COMahkMal7xO-QO05CaD53yDNDqtjn-5TIX_CjJbnA_Hn7zepoxebtpbt-qJJjzMerW_Mc8QUJBH4tR-T3keh-83xbnBT5KaKO2-RnPXbcWjt_lWh_bLf_kQN3TbxuO5bRiL66I0h6jDn3oyT3VXp0n54nTqjDHfRuDVItXf-L_qtDk-PnVeUP3DhbZKxtqtDKjXJ7X2fclHJ7z-R3IBPCD0tjk-6JnWncKaRcI3poiqKtmjJb6XJkl2HQ405OT-6-O0KJcbRodobAwhPJvyT8DXnO7-fRTfJuJ_DDMJDD3fP36q4QV-JIehmT22jnT32JeaJ5n0-nnhP3mBTbA3JDYX-Oh-jjRX56GhfO_0R3jsJKRy66jK4JKjHKet6vP; ispeed_lsm=0; H_PS_PSSID=1421_24558_21120_17001_24880_22072; BD_UPN=123253; H_PS_645EC=44be6I1wqYYVvyugm2gc3PK9PoSa26pxhzOVbeQrn2rRadHvKoI%2BCbN5K%2Bg; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598&#39;,
&#39;Host&#39;:&#39;www.baidu.com&#39;,
&#39;User-Agent&#39;:&#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36&#39;}

# response=requests.get(&#39;https://www.baidu.com/s?&#39;+urlencode({&#39;wd&#39;:&#39;美女&#39;}),headers=headers)
response=requests.get(&#39;https://www.baidu.com/s&#39;,params={&#39;wd&#39;:&#39;美女&#39;},headers=headers) #params内部就是调用urlencode
print(response.text)
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;五response&#34;&gt;五、Response&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;#1、响应状态
    200：代表成功
    301：代表跳转
    404：文件不存在
    403：权限
    502：服务器错误

#2、Respone header
    set-cookie：可能有多个，是来告诉浏览器，把cookie保存下来
    
#3、preview就是网页源代码
    最主要的部分，包含了请求资源的内容
    如网页html，图片
    二进制数据等
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;六总结&#34;&gt;六、总结&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;#1、总结爬虫流程：
    爬取---&amp;gt;解析---&amp;gt;存储

#2、爬虫所需工具：
    请求库：requests,selenium
    解析库：正则，beautifulsoup，pyquery
    存储库：文件，MySQL，Mongodb，Redis

#3、爬虫常用框架：
    scrapy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;爬取校花网视频&lt;/p&gt;</description>
    </item>
    <item>
      <title>【爬虫】请求库之requests库</title>
      <link>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E8%AF%B7%E6%B1%82%E5%BA%93%E4%B9%8Brequests%E5%BA%93/</link>
      <pubDate>Mon, 25 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%88%AC%E8%99%AB%E8%AF%B7%E6%B1%82%E5%BA%93%E4%B9%8Brequests%E5%BA%93/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;爬虫.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/202009031721_5943.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;一介绍&#34;&gt;一、介绍&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;#介绍：使用requests可以模拟浏览器的请求，比起之前用到的urllib，requests模块的api更加便捷（本质就是封装了urllib3）

#注意：requests库发送请求将网页内容下载下来以后，并不会执行js代码，这需要我们自己分析目标站点然后发起新的request请求

#安装：pip3 install requests

#各种请求方式：常用的就是requests.get()和requests.post()
&amp;gt;&amp;gt;&amp;gt; import requests
&amp;gt;&amp;gt;&amp;gt; r = requests.get(&#39;https://api.github.com/events&#39;)
&amp;gt;&amp;gt;&amp;gt; r = requests.post(&#39;http://httpbin.org/post&#39;, data = {&#39;key&#39;:&#39;value&#39;})
&amp;gt;&amp;gt;&amp;gt; r = requests.put(&#39;http://httpbin.org/put&#39;, data = {&#39;key&#39;:&#39;value&#39;})
&amp;gt;&amp;gt;&amp;gt; r = requests.delete(&#39;http://httpbin.org/delete&#39;)
&amp;gt;&amp;gt;&amp;gt; r = requests.head(&#39;http://httpbin.org/get&#39;)
&amp;gt;&amp;gt;&amp;gt; r = requests.options(&#39;http://httpbin.org/get&#39;)

#建议在正式学习requests前，先熟悉下HTTP协议
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&#34;http://docs.python-requests.org/en/master/&#34;&gt;官网链接：http://docs.python-requests.org/en/master/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;二基于get请求&#34;&gt;二、基于GET请求&lt;/h1&gt;
&lt;p&gt;1、基本请求&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import requests
response=requests.get(&#39; 
print(response.text)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2、带参数的GET请求-&amp;gt;params&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#在请求头内将自己伪装成浏览器，否则百度不会正常返回页面内容
import requests
response=requests.get(&#39;https://www.baidu.com/s?wd=python&amp;amp;pn=1&#39;,
                      headers={
                        &#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36&#39;,
                      })
print(response.text)



#如果查询关键词是中文或者有其他特殊符号，则不得不进行url编码
from urllib.parse import urlencode
wd=&#39;egon老师&#39;
encode_res=urlencode({&#39;k&#39;:wd},encoding=&#39;utf-8&#39;)
keyword=encode_res.split(&#39;=&#39;)[1]
print(keyword)
# 然后拼接成url
url=&#39;https://www.baidu.com/s?wd=%s&amp;amp;pn=1&#39; %keyword

response=requests.get(url,
                      headers={
                        &#39;User-Agent&#39;:&#39;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36&#39;,
                      })
res1=response.text

自己拼接GET参数
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;params参数的使用&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
