手把手教你入门Python爬虫(一)

手把手教你入门Python爬虫

前言

  本文通过介绍基本的html、计算机网络等知识,带领读者了解访问网页时发生了什么;并通过“爬取豆瓣Top250电影信息”的项目,向读者展示了一个最基本的爬虫过程。本文适合作为读者入门爬虫的文章,需要读者有一定的Python语法基础(包括但不限于条件判断、循环语句、定义函数、基本数据类型、函数调用等知识)。
  作者的开发环境如下:

  • Python 3.8.1
  • IDE: Pycharm Community 2020.1.4

目录

  • 浏览器是如何帮助我们浏览网页的
  • 爬虫的基本构思
  • “爬取豆瓣Top250电影信息”项目
  • 致谢

1. 浏览器是如何帮助我们浏览网页的

  我们日常使用浏览器时,只需在浏览器最上方的地址栏输入目标网址,按下回车,即可访问一个网页。看似简单的一个操作,其实暗藏了许多繁琐的步骤。下面,我们通过一个简单的例子,来了解浏览器帮助我们完成了哪些操作:

  • 假设小明要访问百度网站,他在Chrome浏览器的地址栏输入了
    https://www.baidu.com/,并按下了回车
    手把手教你入门Python爬虫(一)_第1张图片
  • 浏览器查找自身的DNS缓存,希望找到"https://www.baidu.com/" 对应的IP地址。(假设浏览器在自身DNS缓存中找到,但已过期)
  • 浏览器查询操作系统的DNS缓存,希望找到"https://www.baidu.com/" 对应的IP地址。(假设浏览器在操作系统的DNS缓存中未找到)
  • 浏览器查询本机的hosts文件,试图从中找到"https://www.baidu.com/" 对应的IP地址。(假设浏览器并未找到)
  • 浏览器发起一个DNS系统调用,向本地配置的首选DNS服务器发起域名解析请求,即请求"https://www.baidu.com/" 对应的IP地址。举例几个DNS服务器:

阿里DNS: 180.76.76.76
百度DNS: 223.5.5.5
谷歌DNS: 8.8.8.8

  • DNS服务器查询到了"https://www.baidu.com/" 对应的IP地址,并返回给浏览器
  • 浏览器通过TCP/IP协议,借助上一步收到的IP地址和服务器端默认端口80,向目标服务器建立连接即三次握手
  • 浏览器向服务器发送HTTP请求。(如果使用Chrome浏览器,可以通过"自定义及控制"->“更多工具”->“开发者工具”->"Network"查看具体请求信息)

手把手教你入门Python爬虫(一)_第2张图片
手把手教你入门Python爬虫(一)_第3张图片

Status Code:状态码,200代表成功与目标服务器建立连接;404代表服务器无反应;418代表触发了反爬机制,禁止访问
User-Agent:用户代理,即小明使用的浏览器告诉目标服务器,我们是哪种浏览器(小明使用的浏览器是Chrome,但Chrome却告诉目标服务器,我是Mozilla等等浏览器,这里出现的问题与各大浏览器厂商间的一段爱恨情仇有关,有兴趣的同学可以自行搜索了解)

  • (若连接成功且没有触发服务器的反爬机制)服务器将数据(即html文件)返回给浏览器
  • 浏览器收到index.html文件,开始解析其中的JS和CSS等代码
  • 页面加载、渲染完毕
  • 关闭TCP连接即四次挥手

  至此,即完成了一个简单的浏览网页过程,可以看出。浏览器主要的工作是将用户输入的URL映射到IP地址;与服务器建立连接;传输数据;解析数据以及关闭连接。
  下面介绍几个基本的概念:

  • URL:Uniform Resource Locator 即统一资源定位器,即网络地址。例如:http://www/baidu.com/。(URL可以方便人们记忆网站地址,不用背繁琐的IP地址)
  • IP地址:Internet Protocol Address 即互联网协议地址。(类似于门牌号,即在互联网中可以通过IP地址找到唯一对应服务器)
  • HTML:Hyper Text Mark-up Language 即超文本标记语言,是一种制作万维网页面的标准语言
  • DNS:Domain Name System即域名系统,是存在于互联网技术中的一项服务,作为域名(URL)与IP地址映射的一个分布式数据库

2.爬虫的基本构思

  通过第一节,已经了解到,我们看到的网页(即看到的图片、文字等)是存在一个html文件里,通过服务器发送给浏览器,浏览器再解析、展现给我们。
  如果我们把页面保存下载到本地,是不是可以把重要的数据存下来了呢?答案是可以的,但是这种文件内存在着大量的超文本标记语言,不利于我们获取信息。(例如"https://www.baidu.com/"的网页源码如下)
手把手教你入门Python爬虫(一)_第4张图片

  假设我们想编写一个JAVA程序,把"https://www.baidu.com/"的网页源码解析、去除超文本标记语言(等),只保留页面左上角的所有字符串,即新闻、hao123、地图、视频、贴吧、学术、更多,这7个字符串,并输出到编程语言的控制台。
手把手教你入门Python爬虫(一)_第5张图片

  有一种思路可能是:把html文本转换格式成txt(内容不会变),把txt按行读取到Java中的变量,再编写一个函数(输入字符串,内部通过判断字符串两端是否含有"<"、">",输出该字符串是否为超文本标记语言),循环遍历所有的字符串,借用函数判断该字符串是否为超文本标记语言(如果是,则删去),对留下的字符串进行输出。
  上述构思符合多数只入门了编程语言的同学,看似合理,其实输出后的内容与我们的预期大不相同,其中有一点原因就是:去除超文本标记语言后,页面仍有许多其他信息,比如标签下有一个标签,里面有如下信息:<br> <a href="http://img.e-com-net.com/image/info8/44a6ac74f22c4d759afdd92382e32d94.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/44a6ac74f22c4d759afdd92382e32d94.jpg" alt="手把手教你入门Python爬虫(一)_第6张图片" width="650" height="138" style="border:1px solid black;"></a></p> <p>  因此我们希望有一个近乎完美的工具,能够帮我们自动获取服务器的html文件,并解析、去除超文本标记语言(只留下文本),并按要求自动筛取数据。此时,这个工具便是爬虫了! 一个简单的爬虫程序基本分为以下几步:</p> <ul> <li>模拟人为操作,模拟浏览器操作,将URL地址转换为IP地址,向服务器发送请求</li> <li>将服务器返回的html文件读入内存,解析网页源码</li> <li>按照一定的规律,去除超文本标记语言,只保存指定数据</li> <li>将数据保存至excel文件或数据库</li> </ul> <h2>3. “爬取豆瓣Top250电影信息”项目</h2> <p>  通过上文的介绍,我们已经基本熟悉了爬虫项目的架构,那么下面我们就从一个最简单的例子,来学习编写爬虫。</p> <ul> <li>建立一个文件夹"爬虫",在文件夹下建立一个Python文件,命名为:爬取豆瓣数据.py</li> <li>观察豆瓣网址"https://movie.douban.com/top250?start=“的源码<br> <a href="http://img.e-com-net.com/image/info8/c9113c6461a4471db965ccff08a7e040.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/c9113c6461a4471db965ccff08a7e040.jpg" alt="手把手教你入门Python爬虫(一)_第7张图片" width="650" height="164" style="border:1px solid black;"></a><br>   该网页基本由两个大标签head和body构成,而我们要获取的电影信息(例如导演信息),均在body标签下的标签下的…的标签下:<br> <a href="http://img.e-com-net.com/image/info8/0c93dcb2dda9445d932913bdbf136223.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/0c93dcb2dda9445d932913bdbf136223.jpg" alt="手把手教你入门Python爬虫(一)_第8张图片" width="650" height="322" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/2efe14d41f0548149d74a1eccb0333c8.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/2efe14d41f0548149d74a1eccb0333c8.jpg" alt="手把手教你入门Python爬虫(一)_第9张图片" width="650" height="280" style="border:1px solid black;"></a><br>   此时我们跳转到显示排26-50名电影的第二页,发现网页源码为:“https://movie.douban.com/top250?start=25&filter=”,如果我们编辑这个URL,把最后的”&filter="删掉,再按回车,发现仍能正常访问网页。<br>   通过上述操作,我们能发现一个规律,显示豆瓣Top250电影信息的10张网页的URL只有"start="后的参数不同,而且这个参数是25的倍数。(这条规律会在下文批量生成URL连接用到)</li> <li>编写如下程序用以加载我们爬虫程序会用到的工具库,这些库在下文应用时会具体讲解</li> </ul> <pre><code class="prism language-python"><span class="token comment"># 加载包</span> <span class="token keyword">import</span> bs4 <span class="token comment"># 网页解析,获得数据</span> <span class="token keyword">import</span> re <span class="token comment"># 正则表达式,进行文字匹配</span> <span class="token keyword">import</span> urllib<span class="token punctuation">.</span>request<span class="token punctuation">,</span>urllib<span class="token punctuation">.</span>error <span class="token comment"># 指定URL,获取网页数据</span> <span class="token keyword">import</span> xlwt <span class="token comment"># 进行excel操作</span> <span class="token keyword">from</span> bs4 <span class="token keyword">import</span> BeautifulSoup </code></pre> <ul> <li>根据前面的学习,我们此次项目基本需要编写以下几个函数:</li> </ul> <pre><code class="prism language-python"><span class="token comment"># 主函数,用于调用各个函数</span> <span class="token keyword">def</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># 爬取网页获取数据函数,输入一个url地址,返回解析、去除无关信息后的数据</span> <span class="token keyword">def</span> <span class="token function">getData</span><span class="token punctuation">(</span>baseurl<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># 得到指定一个URL的网页内容(html文件)的数据,输入一个url地址</span> <span class="token keyword">def</span> <span class="token function">askURL</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># 保存数据函数,输入为数据列表、保存路径</span> <span class="token keyword">def</span> <span class="token function">saveData</span><span class="token punctuation">(</span>datalist<span class="token punctuation">,</span>savepath<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># 定义程序执行入口,将主函数写在内</span> <span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">"__main__"</span><span class="token punctuation">:</span> </code></pre> <ul> <li>根据构思,程序从入口__main__开始执行,执行main函数,main函数调用各函数。编写入口代码如下:</li> </ul> <pre><code class="prism language-python"><span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">"__main__"</span><span class="token punctuation">:</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'开始执行程序'</span><span class="token punctuation">)</span> main<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'爬取完毕'</span><span class="token punctuation">)</span> </code></pre> <ul> <li>编写main函数</li> </ul> <pre><code class="prism language-python"><span class="token keyword">def</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># 定义一个基础的URL</span> baseurl <span class="token operator">=</span> <span class="token string">'https://movie.douban.com/top250?start='</span> </code></pre> <ul> <li>编写askURL函数</li> </ul> <pre><code class="prism language-python"><span class="token keyword">def</span> <span class="token function">askURL</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># 利用字典的数据格式,保存用户代理信息到head变量,用于模拟浏览器</span> <span class="token comment"># 如果不自定义设置我们发送的请求中的User-Agent信息</span> <span class="token comment"># Python会自动帮我们设置成User-Agent: Python -version</span> <span class="token comment"># 这会触发服务器的反爬机制,禁止访问</span> head <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token string">'User-Agent'</span><span class="token punctuation">:</span> <span class="token string">'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'</span> <span class="token punctuation">}</span> <span class="token comment"># 利用urllib.request.Request()方法,把URL和自定义User-Agent封装成一个可以发送到目标服务器的请求</span> request <span class="token operator">=</span> urllib<span class="token punctuation">.</span>request<span class="token punctuation">.</span>Request<span class="token punctuation">(</span>url<span class="token punctuation">,</span> headers<span class="token operator">=</span>head<span class="token punctuation">)</span> <span class="token comment"># 定义一个空字符串,用于后续接受返回html内容</span> html <span class="token operator">=</span> <span class="token string">''</span> <span class="token keyword">try</span><span class="token punctuation">:</span> <span class="token comment"># 利用urllib.request.urlopen()方法,发送请求,并将返回结果保存至response变量</span> <span class="token comment"># 下文对response对象的info()方法进行了输出,向读者展示了urllib.request.urlopen()方法具体返回的是什么</span> response <span class="token operator">=</span> urllib<span class="token punctuation">.</span>request<span class="token punctuation">.</span>urlopen<span class="token punctuation">(</span>request<span class="token punctuation">)</span> <span class="token comment"># 建议读者读至此处,转去阅读下文绿色底色文本,之后再返回本处</span> <span class="token comment"># 对返回的html文件(存储在response对象中)进行解码</span> html <span class="token operator">=</span> response<span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span> <span class="token comment"># 异常处理</span> <span class="token keyword">except</span> urllib<span class="token punctuation">.</span>error<span class="token punctuation">.</span>URLError <span class="token keyword">as</span> e<span class="token punctuation">:</span> <span class="token keyword">if</span> <span class="token builtin">hasattr</span><span class="token punctuation">(</span>e<span class="token punctuation">,</span> <span class="token string">'code'</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">print</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>code<span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token builtin">hasattr</span><span class="token punctuation">(</span>e<span class="token punctuation">,</span> <span class="token string">'reason'</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword">print</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>reason<span class="token punctuation">)</span> <span class="token comment"># 返回解码处理好的html文件</span> <span class="token keyword">return</span> html </code></pre> <p>  如果打印response对象,则会出现以下信息:<br> <a href="http://img.e-com-net.com/image/info8/9ca4bfdc41d64b108b138dfe54c4db93.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/9ca4bfdc41d64b108b138dfe54c4db93.png" alt="print(response)返回信息" width="546" height="33"></a><br>   该信息表示response对象保存的内存地址。<br> <a href="http://img.e-com-net.com/image/info8/25989703c1504744ac422795ecf56911.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/25989703c1504744ac422795ecf56911.jpg" alt="手把手教你入门Python爬虫(一)_第10张图片" width="650" height="340" style="border:1px solid black;"></a><br>   该信息表示response对象的具体信息,包括创建日期(Sat, 01 Aug 2020 13:35:32 GMT),内容类型(txt / html)等内容。<br>   其中Transfer-Encoding: chunked表示分块传输,可以通俗理解为,我们直接接收到的html文件因分块传输,被加密了,我们需要解码才能使用,我们可以用print(response.read())命令打印以下看看被加密的html文件长什么样子:<br> <a href="http://img.e-com-net.com/image/info8/33ef45a76e304a18a3757061531c4ae1.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/33ef45a76e304a18a3757061531c4ae1.jpg" alt="手把手教你入门Python爬虫(一)_第11张图片" width="650" height="270" style="border:1px solid black;"></a><br>   使用response.read().decode()方法解码后(部分)信息如下:<br> <a href="http://img.e-com-net.com/image/info8/774e0c6f5a4c409292b859a55b3878f5.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/774e0c6f5a4c409292b859a55b3878f5.jpg" alt="手把手教你入门Python爬虫(一)_第12张图片" width="650" height="307" style="border:1px solid black;"></a><br>   仔细观察上述两幅图片展示的信息(html文件解码前、html文件解码后)对比发现,除了解码后的文件,将换行符\n转义为换行操作外,还将十六进制代码按照UTF-8规则:</p> <blockquote> <p>\xe8\xb1\x86\xe7\x93\xa3\xe7\x94\xb5\xe5\xbd\xb1 Top 250</p> </blockquote> <p>  解码成:</p> <blockquote> <p>豆瓣电影 Top 250</p> </blockquote> <p>  可见解码操作是很重要的,只有解码后,才能正常显示我们想要的信息。</p> <ul> <li>编写getData(baseurl)函数</li> </ul> <pre><code class="prism language-python"><span class="token keyword">def</span> <span class="token function">getData</span><span class="token punctuation">(</span>baseurl<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># 爬取网页,用于获取数据</span> <span class="token comment"># 创建一个空列表,用于接受数据</span> datalist <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># 循环10次,代表爬取10个网页</span> <span class="token comment"># 根据上文分析的10个页面URL之间的联系,生成URL</span> url <span class="token operator">=</span> baseurl <span class="token operator">+</span> <span class="token builtin">str</span><span class="token punctuation">(</span>i <span class="token operator">*</span> <span class="token number">25</span><span class="token punctuation">)</span> <span class="token comment"># 保存获取到的网页源码</span> html <span class="token operator">=</span> askURL<span class="token punctuation">(</span>url<span class="token punctuation">)</span> <span class="token comment"># 使用BeautifulSoup()方法逐一解析爬取的网页,输入参数为:网页源码和选择使用的解析器</span> soup <span class="token operator">=</span> BeautifulSoup<span class="token punctuation">(</span>html<span class="token punctuation">,</span> <span class="token string">'html.parser'</span><span class="token punctuation">)</span> <span class="token comment"># 建议读者转去阅读下文中绿色底色文本,之后再返回阅读此处</span> <span class="token comment"># 遍历每一个属性为item的div标签</span> <span class="token keyword">for</span> item <span class="token keyword">in</span> soup<span class="token punctuation">.</span>find_all<span class="token punctuation">(</span><span class="token string">'div'</span><span class="token punctuation">,</span> class_<span class="token operator">=</span><span class="token string">"item"</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># 在网页源码中查找符合要求的标签(是一个div标签,且属性为item),形成列表</span> <span class="token comment"># 在本例中,item遍历的第一个标签为:(即在第一次循环,item等于如下)</span> <span class="token comment"># 请转至下方标黄字样处阅读</span> <span class="token comment"># 创建一个空列表,保存一部电影的所有信息</span> data <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token comment"># 将查询到的html标签,转换为字符串格式</span> item <span class="token operator">=</span> <span class="token builtin">str</span><span class="token punctuation">(</span>item<span class="token punctuation">)</span> <span class="token comment"># 通过正则表达式查找,关于re.find_all()方法的理解,可以参考下文中标黄字样处</span> <span class="token comment"># 获取影片链接</span> link <span class="token operator">=</span> re<span class="token punctuation">.</span>findall<span class="token punctuation">(</span>findlink<span class="token punctuation">,</span> item<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token comment"># append()方法为向列表添加内容</span> data<span class="token punctuation">.</span>append<span class="token punctuation">(</span>link<span class="token punctuation">)</span> <span class="token comment"># 添加链接</span> <span class="token comment"># 获取图片链接</span> ImgSrc <span class="token operator">=</span> re<span class="token punctuation">.</span>findall<span class="token punctuation">(</span>findImgSrc<span class="token punctuation">,</span>item<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> data<span class="token punctuation">.</span>append<span class="token punctuation">(</span>ImgSrc<span class="token punctuation">)</span> <span class="token comment"># 添加图片</span> titles <span class="token operator">=</span> re<span class="token punctuation">.</span>findall<span class="token punctuation">(</span>findTitle<span class="token punctuation">,</span>item<span class="token punctuation">)</span> <span class="token comment"># 片名可能有好几个</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>titles<span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">:</span> ctitle <span class="token operator">=</span> titles<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token comment"># 中文名</span> data<span class="token punctuation">.</span>append<span class="token punctuation">(</span>ctitle<span class="token punctuation">)</span> otitle <span class="token operator">=</span> titles<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">,</span><span class="token string">''</span><span class="token punctuation">)</span> <span class="token comment"># 去掉无关符号</span> data<span class="token punctuation">.</span>append<span class="token punctuation">(</span>otitle<span class="token punctuation">)</span> <span class="token comment"># 添加外文名</span> <span class="token keyword">else</span><span class="token punctuation">:</span> data<span class="token punctuation">.</span>append<span class="token punctuation">(</span>titles<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> data<span class="token punctuation">.</span>append<span class="token punctuation">(</span><span class="token string">' '</span><span class="token punctuation">)</span> <span class="token comment"># 外文名留空</span> <span class="token comment"># 添加评分</span> rating <span class="token operator">=</span> re<span class="token punctuation">.</span>findall<span class="token punctuation">(</span>findrating<span class="token punctuation">,</span>item<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> data<span class="token punctuation">.</span>append<span class="token punctuation">(</span>rating<span class="token punctuation">)</span> <span class="token comment"># 添加评价人数</span> judgeNum <span class="token operator">=</span> re<span class="token punctuation">.</span>findall<span class="token punctuation">(</span>findJudge<span class="token punctuation">,</span>item<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> data<span class="token punctuation">.</span>append<span class="token punctuation">(</span>judgeNum<span class="token punctuation">)</span> <span class="token comment"># 添加概述,概述有可能为空</span> inq <span class="token operator">=</span> re<span class="token punctuation">.</span>findall<span class="token punctuation">(</span>findInq<span class="token punctuation">,</span>item<span class="token punctuation">)</span> <span class="token keyword">if</span> <span class="token builtin">len</span><span class="token punctuation">(</span>inq<span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">:</span> inq <span class="token operator">=</span> inq<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">'。'</span><span class="token punctuation">,</span><span class="token string">''</span><span class="token punctuation">)</span> <span class="token comment"># 去掉句号</span> data<span class="token punctuation">.</span>append<span class="token punctuation">(</span>inq<span class="token punctuation">)</span> <span class="token keyword">else</span><span class="token punctuation">:</span> data<span class="token punctuation">.</span>append<span class="token punctuation">(</span><span class="token string">' '</span><span class="token punctuation">)</span> bd <span class="token operator">=</span> re<span class="token punctuation">.</span>findall<span class="token punctuation">(</span>findBd<span class="token punctuation">,</span>item<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> bd <span class="token operator">=</span> re<span class="token punctuation">.</span>sub<span class="token punctuation">(</span><span class="token string">'<br(\s+)?/>(\s+?)'</span><span class="token punctuation">,</span><span class="token string">' '</span><span class="token punctuation">,</span>bd<span class="token punctuation">)</span> <span class="token comment"># 去掉<br/></span> bd <span class="token operator">=</span> re<span class="token punctuation">.</span>sub<span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">,</span><span class="token string">' '</span><span class="token punctuation">,</span>bd<span class="token punctuation">)</span> data<span class="token punctuation">.</span>append<span class="token punctuation">(</span>bd<span class="token punctuation">.</span>strip<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment"># 去掉前后空格</span> datalist<span class="token punctuation">.</span>append<span class="token punctuation">(</span>data<span class="token punctuation">)</span> <span class="token comment"># 把处理好的一部电影信息放入datalist</span> <span class="token keyword">return</span> datalist </code></pre> <p>  在上文中我们探讨了解码后的文件具体是什么样子,现在我们来看一下,经过BeautifulSoup()方法解析后的html文件具体是什么样。使用print(BeautifulSoup(html, ‘html.parser’))命令查看:<br> <a href="http://img.e-com-net.com/image/info8/61f36a4156134f428bde4365896ee764.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/61f36a4156134f428bde4365896ee764.jpg" alt="手把手教你入门Python爬虫(一)_第13张图片" width="650" height="309" style="border:1px solid black;"></a><br>   经对比,BeautifulSoup()方法解析后的html文件与解码后的文件几乎一模一样,那么BeautifulSoup()方法具体做了什么呢?<br>   其实,BeautifulSoup()方法通过分析html文件,在内存中创建了一个又一个的类和对象,并将这些实例化的对象按照树的数据结构排列。<br>   例如:创建<head>类、<body>类、<title>类、<link>类;创建了一个<head>对象,创建了一个<title>对象,并且文本为"豆瓣电影Top250",这个<title>对象就是<head>对象的子节点。<br>   有了BeautifulSoup()方法解析后的html文件,我们就可以通过方法,调用对象,实现信息的筛取和提取了。<br>   <mark>item遍历</mark>第一个对象时的取值为:<br> <a href="http://img.e-com-net.com/image/info8/4e50f53117a84fe2bc2541814ccc4482.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/4e50f53117a84fe2bc2541814ccc4482.jpg" alt="手把手教你入门Python爬虫(一)_第14张图片" width="650" height="446" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/ecab23fd7c1a4574a4c4bad382acacf4.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/ecab23fd7c1a4574a4c4bad382acacf4.jpg" alt="手把手教你入门Python爬虫(一)_第15张图片" width="650" height="442" style="border:1px solid black;"></a><br> <a href="http://img.e-com-net.com/image/info8/d771bb3a83e647fb8562984b2b135309.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/d771bb3a83e647fb8562984b2b135309.jpg" alt="手把手教你入门Python爬虫(一)_第16张图片" width="650" height="187" style="border:1px solid black;"></a><br>   <mark>re.find_all()方法</mark>:<br>   输入为正则表达式、待查找对象,返回值为一个列表。这个方法可以通俗的理解为,给他传递一个查找规则,和待查找文本,re.find_all()会将所有符合规则的字符串,按照先后顺序排列成一个列表返回。<br>   在本例中,第一次出现为:</p> <pre><code class="prism language-python">link <span class="token operator">=</span> re<span class="token punctuation">.</span>findall<span class="token punctuation">(</span>findlink<span class="token punctuation">,</span> item<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> </code></pre> <p>  参数"findlink",本文还未给出定义(因需要将findlink参数定义为全局变量,故不能定义在getData()函数中),现将定义给出:</p> <pre><code class="prism language-python">findlink <span class="token operator">=</span> re<span class="token punctuation">.</span><span class="token builtin">compile</span><span class="token punctuation">(</span>r<span class="token string">'<a href="(.*?)">'</span><span class="token punctuation">)</span> <span class="token comment"># re.compile()方法用于创造正则表达式对象</span> <span class="token comment"># 该正则表达式的意思为:一个字符串,开头一定得是:<a href=",结尾一定得是:",中间至少有一个字符</span> </code></pre> <p>  因此,在本例中,link为item中第一个符合要求的字符串,即https://movie.douban.com/subject/1292052/,也就是对应的第一个影片的链接。<br>   本文因篇幅有限,不过多介绍正则表达式的详细内容,读者只需了解通过正则表达式,我们可以找寻到符合特定规则的字符串</p> <ul> <li>编写正则表达式规则(设置为全局变量)</li> </ul> <pre><code class="prism language-python"><span class="token comment"># 影片链接</span> findlink <span class="token operator">=</span> re<span class="token punctuation">.</span><span class="token builtin">compile</span><span class="token punctuation">(</span>r<span class="token string">'<a href="(.*?)">'</span><span class="token punctuation">)</span> <span class="token comment"># re.compile()方法用于创造正则表达式对象</span> <span class="token comment"># 影片图片链接</span> findImgSrc <span class="token operator">=</span> re<span class="token punctuation">.</span><span class="token builtin">compile</span><span class="token punctuation">(</span>r<span class="token string">'<img.*src="(.*?)"'</span><span class="token punctuation">,</span> re<span class="token punctuation">.</span>S<span class="token punctuation">)</span> <span class="token comment"># re.s参数让换行符包含在字符中</span> <span class="token comment"># 影片片名</span> findTitle <span class="token operator">=</span> re<span class="token punctuation">.</span><span class="token builtin">compile</span><span class="token punctuation">(</span>r<span class="token string">'<span class="title">(.*)</span>'</span><span class="token punctuation">)</span> <span class="token comment"># 影片评分</span> findrating <span class="token operator">=</span> re<span class="token punctuation">.</span><span class="token builtin">compile</span><span class="token punctuation">(</span>r<span class="token string">'<span class="rating_num" property="v:average">(.*)</span>'</span><span class="token punctuation">)</span> <span class="token comment"># 评价人数</span> findJudge <span class="token operator">=</span> re<span class="token punctuation">.</span><span class="token builtin">compile</span><span class="token punctuation">(</span>r<span class="token string">'<span>(\d*)人评价</span>'</span><span class="token punctuation">)</span> <span class="token comment"># 找到概况</span> findInq <span class="token operator">=</span> re<span class="token punctuation">.</span><span class="token builtin">compile</span><span class="token punctuation">(</span>r<span class="token string">'<span class="inq">(.*)</span>'</span><span class="token punctuation">)</span> <span class="token comment"># 找到影片相关内容</span> findBd <span class="token operator">=</span> re<span class="token punctuation">.</span><span class="token builtin">compile</span><span class="token punctuation">(</span>r<span class="token string">'<p class="">(.*?)</p>'</span><span class="token punctuation">,</span> re<span class="token punctuation">.</span>S<span class="token punctuation">)</span> </code></pre> <ul> <li>编写saveData()函数,用于保存爬取到的数据</li> </ul> <pre><code class="prism language-python"><span class="token keyword">def</span> <span class="token function">saveData</span><span class="token punctuation">(</span>datalist<span class="token punctuation">,</span>savepath<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># 参数为需要保存到excel中的数据、保存路径</span> <span class="token comment"># xlwt.Workbook()方法为新建一个excel文件</span> book <span class="token operator">=</span> xlwt<span class="token punctuation">.</span>Workbook<span class="token punctuation">(</span>encoding<span class="token operator">=</span><span class="token string">'utf-8'</span><span class="token punctuation">,</span>style_compression<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token comment"># add_sheet()方法为在新建的excel文件中添加一个sheet</span> sheet <span class="token operator">=</span> book<span class="token punctuation">.</span>add_sheet<span class="token punctuation">(</span><span class="token string">'豆瓣电影Top250'</span><span class="token punctuation">,</span> cell_overwrite_ok<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span> <span class="token comment"># 将列名保存到一个元组中</span> col <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token string">'电影详情链接'</span><span class="token punctuation">,</span><span class="token string">'图片链接'</span><span class="token punctuation">,</span><span class="token string">'影片中文名'</span><span class="token punctuation">,</span><span class="token string">'影片外文名'</span><span class="token punctuation">,</span><span class="token string">'评分'</span><span class="token punctuation">,</span><span class="token string">'评价人数'</span><span class="token punctuation">,</span><span class="token string">'概况'</span><span class="token punctuation">,</span><span class="token string">'相关信息'</span><span class="token punctuation">)</span> <span class="token comment"># 向sheet表写入数据:写入列名</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># write()方法中的第一个参数为行号,第二个参数为列号,第三个参数为保存的数据</span> sheet<span class="token punctuation">.</span>write<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span>i<span class="token punctuation">,</span>col<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment"># 保存电影信息</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">250</span><span class="token punctuation">)</span><span class="token punctuation">:</span> h <span class="token operator">=</span> i <span class="token operator">+</span><span class="token number">1</span> <span class="token comment"># 输出记录下正在保存第几条信息</span> <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'第 %d 条'</span> <span class="token operator">%</span> h<span class="token punctuation">)</span> data <span class="token operator">=</span> datalist<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">:</span> sheet<span class="token punctuation">.</span>write<span class="token punctuation">(</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span>j<span class="token punctuation">,</span>data<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span> book<span class="token punctuation">.</span>save<span class="token punctuation">(</span>savepath<span class="token punctuation">)</span> </code></pre> <ul> <li>完善main函数</li> </ul> <pre><code class="prism language-python"><span class="token keyword">def</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> baseurl <span class="token operator">=</span> <span class="token string">'https://movie.douban.com/top250?start='</span> <span class="token comment"># 定义网页URL</span> <span class="token comment"># 1. 爬取网页+解析数据</span> datalist <span class="token operator">=</span> getData<span class="token punctuation">(</span>baseurl<span class="token punctuation">)</span> <span class="token comment"># 2. 保存数据</span> savepath <span class="token operator">=</span> <span class="token string">'豆瓣电影Top250.xls'</span> saveData<span class="token punctuation">(</span>datalist<span class="token punctuation">,</span>savepath<span class="token punctuation">)</span> <span class="token comment"># 定义将数据保存到当前文件夹下</span> </code></pre> <p>  到此,便完成了我们爬取豆瓣Top250名电影信息的项目。</p> <h2>致谢</h2> <p>  作者在完成本项目时,参考了以下内容,在此对编写以下内容的作者表示感谢:</p> <blockquote> <ol> <li>B站IT私塾Python爬虫技术课程</li> <li>URL转换成IP的过程:https://blog.csdn.net/qq_31869107/article/details/89363996</li> </ol> </blockquote> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1304092097816596480"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Python爬虫)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835490218845761536.htm" title="Python爬虫解析工具之xpath使用详解" target="_blank">Python爬虫解析工具之xpath使用详解</a> <span class="text-muted">eqa11</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>文章目录Python爬虫解析工具之xpath使用详解一、引言二、环境准备1、插件安装2、依赖库安装三、xpath语法详解1、路径表达式2、通配符3、谓语4、常用函数四、xpath在Python代码中的使用1、文档树的创建2、使用xpath表达式3、获取元素内容和属性五、总结Python爬虫解析工具之xpath使用详解一、引言在Python爬虫开发中,数据提取是一个至关重要的环节。xpath作为一门</div> </li> <li><a href="/article/1835412560413814784.htm" title="python爬取微信小程序数据,python爬取小程序数据" target="_blank">python爬取微信小程序数据,python爬取小程序数据</a> <span class="text-muted">2301_81900439</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>大家好,小编来为大家解答以下问题,python爬取微信小程序数据,python爬取小程序数据,现在让我们一起来看看吧!Python爬虫系列之微信小程序实战基于Scrapy爬虫框架实现对微信小程序数据的爬取首先,你得需要安装抓包工具,这里推荐使用Charles,至于怎么使用后期有时间我会出一个事例最重要的步骤之一就是分析接口,理清楚每一个接口功能,然后连接起来形成接口串思路,再通过Spider的回调</div> </li> <li><a href="/article/1835257575277424640.htm" title="【Python爬虫】百度百科词条内容" target="_blank">【Python爬虫】百度百科词条内容</a> <span class="text-muted">PokiFighting</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86/1.htm">数据处理</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>词条内容我这里随便选取了一个链接,用的是FBI的词条importurllib.requestimporturllib.parsefromlxmlimportetreedefquery(url):headers={'user-agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/80.</div> </li> <li><a href="/article/1835157319500001280.htm" title="Python爬虫代理池" target="_blank">Python爬虫代理池</a> <span class="text-muted">极客李华</span> <a class="tag" taget="_blank" href="/search/python%E6%8E%88%E8%AF%BE/1.htm">python授课</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>Python爬虫代理池网络爬虫在数据采集和信息抓取方面起到了关键作用。然而,为了应对网站的反爬虫机制和保护爬虫的真实身份,使用代理池变得至关重要。1.代理池的基本概念:代理池是一组包含多个代理IP地址的集合。通过在爬虫中使用代理池,我们能够隐藏爬虫的真实IP地址,实现一定程度的匿名性。这有助于防止被目标网站封锁或限制访问频率。2.为何使用代理池:匿名性:代理池允许爬虫在请求目标网站时使用不同的IP</div> </li> <li><a href="/article/1835067814621310976.htm" title="10个高效的Python爬虫框架,你用过几个?" target="_blank">10个高效的Python爬虫框架,你用过几个?</a> <span class="text-muted">进击的C语言</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapyscrapy官网:https://scrapy.org/scrapy中文文档:https://www.osgeo.cn/scrapy/intro/oScrapy是一个为了爬取网站数据,提取结构性数据而编写的</div> </li> <li><a href="/article/1835007168928116736.htm" title="python爬虫(5)之CSDN" target="_blank">python爬虫(5)之CSDN</a> <span class="text-muted">It is a deal️</span> <a class="tag" taget="_blank" href="/search/%E5%B0%8F%E9%A1%B9%E7%9B%AE/1.htm">小项目</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>CSDN的爬虫相对于doubatop250更加简单,一般只需要title和url即可下面是相关的代码:#爬虫之csdn#分析urlhttps://www.csdn.net/api/articles?type=more&category=python&shown_offset=0(firstpage)#https://www.csdn.net/api/articles?type=more&categ</div> </li> <li><a href="/article/1834943236649611264.htm" title="Python——爬虫" target="_blank">Python——爬虫</a> <span class="text-muted">星和月</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>当编写一个Python爬虫时,你可以使用BeautifulSoup库来解析网页内容,使用requests库来获取网页的HTML代码。下面是一个简单的示例,演示了如何获取并解析网页内容:importrequestsfrombs4importBeautifulSoup#发送HTTP请求获取网页内容url='https://www.example.com'#要爬取的网页的URLresponse=requ</div> </li> <li><a href="/article/1834573267847966720.htm" title="基于Python爬虫四川成都二手房数据可视化系统设计与实现(Django框架) 研究背景与意义、国内外研究现状_django商品房数据分析论文(1)" target="_blank">基于Python爬虫四川成都二手房数据可视化系统设计与实现(Django框架) 研究背景与意义、国内外研究现状_django商品房数据分析论文(1)</a> <span class="text-muted">莫莫Android开发</span> <a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>3.国外研究现状在国外,二手房数据可视化也是一个热门的研究领域。以美国为例,有很多公司和网站提供了专门的二手房数据可视化工具,如Zillow、Redfin等。这些工具通常提供房价趋势图、房价分布图、房源信息等功能,帮助用户更好地了解房市动态。综上所述,虽然国内外在二手房数据可视化方面已经有了一些研究成果,但对于四川成都地区的二手房市场还没有相关的研究和可视化系统。因此,本研究旨在设计并实现一个基于</div> </li> <li><a href="/article/1834406896770052096.htm" title="python requests下载网页_python爬虫 requests-html的使用" target="_blank">python requests下载网页_python爬虫 requests-html的使用</a> <span class="text-muted">weixin_39600319</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/requests%E4%B8%8B%E8%BD%BD%E7%BD%91%E9%A1%B5/1.htm">requests下载网页</a> <div>一介绍Python上有一个非常著名的HTTP库——requests,相信大家都听说过,用过的人都说非常爽!现在requests库的作者又发布了一个新库,叫做requests-html,看名字也能猜出来,这是一个解析HTML的库,具备requests的功能以外,还新增了一些更加强大的功能,用起来比requests更爽!接下来我们来介绍一下它吧。#官网解释'''Thislibraryintendsto</div> </li> <li><a href="/article/1834352937887952896.htm" title="解决“Python中 pip不是内部或外部命令,也不是可运行的程序或批处理文件”的方法。" target="_blank">解决“Python中 pip不是内部或外部命令,也不是可运行的程序或批处理文件”的方法。</a> <span class="text-muted">གཡུ །</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E5%B8%B8%E8%A7%84%E9%97%AE%E9%A2%98/1.htm">常规问题</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/pip/1.htm">pip</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/1.htm">自然语言处理</a> <div>解决‘Python中pip不是内部或外部命令,也不是可运行的程序或批处理文件。’的方法1、pip是什么?pip是一个以Python计算机程序语言写成的软件包管理系统,他可以安装和管理软件包,另外不少的软件包也可以在“Python软件包索引”中找到。它可以通过cmd(命令提示符)非常方便地下载和管理Python第三方库,比如,Python爬虫中常见的requests库等。但是我们在使用cmd运行pi</div> </li> <li><a href="/article/1834304768672100352.htm" title="python爬虫的urlib知识梳理" target="_blank">python爬虫的urlib知识梳理</a> <span class="text-muted">卑微小鹿</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>1:urlib.request.urlopen发送请求getpost网络超时timeout=0.1网络请求模拟一个浏览器所发送的网络请求创建requestrequest头信息➕host/IP➕验证➕请求方式cookice客户返回响应数据所留下来的标记代理ipUrlib.request.proxyhander字典类型异常处理codereasonhearders拆分URLurlpaseurlsplit</div> </li> <li><a href="/article/1834212373473357824.htm" title="Python爬虫入门实战:抓取CSDN博客文章" target="_blank">Python爬虫入门实战:抓取CSDN博客文章</a> <span class="text-muted">A Bug's Code Journey</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>一、前言在大数据时代,网络上充斥着海量的信息,而爬虫技术就是解锁这些信息宝库的钥匙。Python,以其简洁易读的语法和强大的库支持,成为编写爬虫的首选语言。本篇博客将从零开始,带你一步步构建一个简单的Python爬虫,抓取CSDN博客的文章标题和链接。二、环境准备在开始之前,确保你的环境中安装了Python和以下必要的库:1.requests:用于发送HTTP请求2.BeautifulSoup:用</div> </li> <li><a href="/article/1834086081184755712.htm" title="Python爬虫——Selenium方法爬取LOL页面" target="_blank">Python爬虫——Selenium方法爬取LOL页面</a> <span class="text-muted">张小生180</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</a> <div>文章目录Selenium介绍用Selenium方法爬取LOL每个英雄的图片及名字Selenium介绍Selenium是一个用于自动化Web应用程序测试的工具,但它同样可以被用来进行网页数据的抓取(爬虫)。Selenium通过模拟用户在浏览器中的操作(如点击、输入、滚动等)来与网页交互,并可以捕获网页的渲染结果,这对于需要JavaScript渲染的网页特别有用。安装Selenium首先,你需要安装S</div> </li> <li><a href="/article/1833969737936236544.htm" title="Python爬虫如何搞定动态Cookie?小白也能学会!" target="_blank">Python爬虫如何搞定动态Cookie?小白也能学会!</a> <span class="text-muted">图灵学者</span> <a class="tag" taget="_blank" href="/search/python%E7%B2%BE%E5%8D%8E/1.htm">python精华</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/github/1.htm">github</a> <div>目录1、动态Cookie基础1.1Cookie与Session的区别1.2动态Cookie生成原理2、requests.Session方法2.1Session对象保持2.2处理登录与Cookie刷新2.3长连接与状态保持策略3、Selenium结合ChromeDriver实战3.1安装配置Selenium3.2动态抓取&处理Cookie4、requests-Session结合Selenium技巧4</div> </li> <li><a href="/article/1833958637698117632.htm" title="Python爬虫基础知识" target="_blank">Python爬虫基础知识</a> <span class="text-muted">板栗妖怪</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>(未完成)爬虫概念爬虫用于爬取数据,又称之为数据采集程序爬取数据来源于网络,网络中数据可以是有web服务器、数据库服务器、索引库、大数据等等提供爬取数据是公开的、非盈利。python爬虫使用python编写的爬虫脚本可以完成定时、定量、指定目标的数据爬取。主要使用多(单)线程/进程、网络请求库、数据解析、数据储存、任务调度等相关技术。爬虫和web后端服务关系爬虫使用网络请求库,相当于客户端请求,w</div> </li> <li><a href="/article/1833633852573184000.htm" title="python爬虫处理滑块验证_python selenium爬虫滑块验证" target="_blank">python爬虫处理滑块验证_python selenium爬虫滑块验证</a> <span class="text-muted">用户6731453637</span> <a class="tag" taget="_blank" href="/search/python%E7%88%AC%E8%99%AB%E5%A4%84%E7%90%86%E6%BB%91%E5%9D%97%E9%AA%8C%E8%AF%81/1.htm">python爬虫处理滑块验证</a> <div>importrandomimporttimefromPILimportImagefromioimportBytesIOimportrequestsasrqfrombs4importBeautifulSoupasbsfromseleniumimportwebdriverfromselenium.webdriverimportActionChainsfromselenium.webdriverimpo</div> </li> <li><a href="/article/1833577124053741568.htm" title="如何用python爬取股票数据选股_用python爬取股票数据" target="_blank">如何用python爬取股票数据选股_用python爬取股票数据</a> <span class="text-muted">weixin_39752087</span> <div>获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一。鉴于此,我拾起了Python这把利器,开启了网络爬虫之路。本篇使用的版本为python3.5,意在抓取证券之星上当天所有A股数据。程序主要分为三个部分:网页源码的获取、所需内容的提取、所得结果的整理。一、网页源码的获取很多人喜欢用python爬虫的原因之一就是它容易上手。只需以下几行代码既可抓取大部分网页的源码。imp</div> </li> <li><a href="/article/1833227903953891328.htm" title="Python爬虫基础总结" target="_blank">Python爬虫基础总结</a> <span class="text-muted">醉蕤</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>活动地址:CSDN21天学习挑战赛学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。学习日记目录学习日记一、关于爬虫1、爬虫的概念2、爬虫的优点3、爬虫的分类4、重要提醒5、反爬和反反爬机制6、协议7、常用请求头和常用的请求方法8、常见的响应状态码9、url的详解二、爬虫基本流程三、可能需要的库四、小例1、requests请求网页2、python解析网页源码(使用Be</div> </li> <li><a href="/article/1833155132641079296.htm" title="2024年最新初面蚂蚁金服,Python爬虫实战:爬取股票信息(1),面试题解析已整理成文档怎么办" target="_blank">2024年最新初面蚂蚁金服,Python爬虫实战:爬取股票信息(1),面试题解析已整理成文档怎么办</a> <span class="text-muted">imtokenmax合约众筹</span> <a class="tag" taget="_blank" href="/search/2024%E5%B9%B4%E7%A8%8B%E5%BA%8F%E5%91%98%E5%AD%A6%E4%B9%A0/1.htm">2024年程序员学习</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>收集整理了一份《2024年最新Python全套学习资料》免费送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!由于文件比较多,这里只是将部分目录截图出来如果你需要这些资料,可以添加V无偿获取:hxbc188(备注666)正文首先要爬取股票数据</div> </li> <li><a href="/article/1833114282561204224.htm" title="Python怎么去抓取公众号的文章?Python爬虫爬取微信公众号方法" target="_blank">Python怎么去抓取公众号的文章?Python爬虫爬取微信公众号方法</a> <span class="text-muted">快乐星球没有乐</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1/1.htm">微信</a> <div>很多小伙伴在学习了爬虫之后都能够使用它去抓取一些网页上的数据了,但是最近有小伙伴问我微信公众号上的文章要怎么去抓取出来。那这一篇文章将会以实际的代码示例来介绍如何去使用python爬虫抓取微信公众号的文章。1.下载wkhtmltopdf1这个应用程序,它可以将HTML格式的数据转换成PDF格式的。2.打开python编辑器,新建一个python项目命名为wxgzhPDF并在里面创建一个空白的pyt</div> </li> <li><a href="/article/1832829231508320256.htm" title="Python爬虫——使用JSON库解析JSON数据_爬虫json解析" target="_blank">Python爬虫——使用JSON库解析JSON数据_爬虫json解析</a> <span class="text-muted">Java老杨</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a> <div>文章目录1如何在网页中获取JSON数据?2Python内置的JSON库这几天在琢磨爬取动态网页,发现需要爬取js内容,虽然说最后还是没有用上JSON库进行解析,不过笔记写的都写了,就发出来记录一下吧。1如何在网页中获取JSON数据?打开一个具有动态渲染的网页,按F12打开浏览器开发工具,点击“网络”,再刷新一下网页,观察是否有新的数据包。发现有js后缀的文件,这就是我们想要的json数据了。2Py</div> </li> <li><a href="/article/1832731040318320640.htm" title="Python100个库分享第16个—sqlparse(SQL解析器)" target="_blank">Python100个库分享第16个—sqlparse(SQL解析器)</a> <span class="text-muted">一晌小贪欢</span> <a class="tag" taget="_blank" href="/search/Python100%E4%B8%AA%E5%BA%93%E5%88%86%E4%BA%AB/1.htm">Python100个库分享</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/python%E5%AD%A6%E4%B9%A0/1.htm">python学习</a><a class="tag" taget="_blank" href="/search/python%E7%88%AC%E8%99%AB/1.htm">python爬虫</a> <div>目录专栏导读库的介绍库的安装1、解析SQL语句2、格式化SQL语句3、提取表名4、分割多条SQL语句实际应用代码参考:总结专栏导读欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手️‍博客主页:请点击——>一晌小贪欢的博客主页求关注该系列文章专栏:请点击——>Python办公自动化专栏求订阅此外还有爬虫专栏:请点击——>Python爬虫基础专栏求订阅此外还有python基础</div> </li> <li><a href="/article/1832693967691542528.htm" title="python web自动化" target="_blank">python web自动化</a> <span class="text-muted">gaoguide2015</span> <a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E5%8C%96/1.htm">自动化</a><a class="tag" taget="_blank" href="/search/%E8%84%9A%E6%9C%AC/1.htm">脚本</a><a class="tag" taget="_blank" href="/search/web/1.htm">web</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>1.python爬虫之模拟登陆csdn(登录、cookie)http://blog.csdn.net/yanggd1987/article/details/52127436?locationNum=32、xml解析:Python网页解析:BeautifulSoup与lxml.html方式对比(xpath)lxml库速度快,功能强大,推荐。http://blog.sina.com.cn/s/blog</div> </li> <li><a href="/article/1832572813739913216.htm" title="Python爬虫-小某书达人榜单" target="_blank">Python爬虫-小某书达人榜单</a> <span class="text-muted">写python的鑫哥</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E5%AE%9E%E6%88%98%E8%BF%9B%E9%98%B6/1.htm">爬虫实战进阶</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/cookie/1.htm">cookie</a><a class="tag" taget="_blank" href="/search/requests/1.htm">requests</a> <div>前言本文是该专栏的第35篇,后面会持续分享python爬虫干货知识,记得关注。本文案例来介绍某平台达人榜单,值得注意的是,在开始之前,需要提前登录,否则榜单无法拿到。废话不多说,下面跟着笔者直接往下看正文。正文目标:aHR0cHM6Ly9keS5odWl0dW4uY29tL2FwcC8jL2FwcC9kYXNoYm9hcmQ=(注:使用base64自行解码)需求:红薯版-达人榜单打开页面之后,先点</div> </li> <li><a href="/article/1832464019999518720.htm" title="【Python爬虫实战】:二手房数据爬取" target="_blank">【Python爬虫实战】:二手房数据爬取</a> <span class="text-muted">3344什么都不是</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/pandas/1.htm">pandas</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a> <div>文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言万维网上有着无数的网页,包含着海量的信息,无孔不入、森罗万象。但很多时候,无论出于数据分析或产品需求,我们需要从某些网站,提取出我们感兴趣、有价值的内容,但是纵然是进化到21世纪的人类,依然只有两只手,一双眼,不可能去每一个网页去点去看,然后再复制粘贴。所以我们需要一种能自动获取网页内容并可以按照指定规则提取</div> </li> <li><a href="/article/1832459858708885504.htm" title="Python爬虫实战" target="_blank">Python爬虫实战</a> <span class="text-muted">weixin_34007879</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>引言网络爬虫是抓取互联网信息的利器,成熟的开源爬虫框架主要集中于两种语言Java和Python。主流的开源爬虫框架包括:1.分布式爬虫框架:Nutch2.Java单机爬虫框架:Crawler4j,WebMagic,WebCollector、Heritrix3.python单机爬虫框架:scrapy、pyspiderNutch是专为搜索引擎设计的的分布式开源框架,上手难度高,开发复杂,基本无法满足快</div> </li> <li><a href="/article/1832422534470004736.htm" title="2024年Python爬虫:爬取招聘网站系列 - 前程无忧" target="_blank">2024年Python爬虫:爬取招聘网站系列 - 前程无忧</a> <span class="text-muted">2401_84562659</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>importpprint#格式化输出模块importcsv#保存csv数据算了,我直接贴代码吧,流程都写清楚了,我把注释也标上了。兄弟们在学习的时候没有人解答和好的学习资料教程就很痛苦,解答或者其它教程都在这了电子书、视频都有!对应视频教程:【Python爬虫】招聘网站实战合集第一弹:爬取前程无忧,零基础也能学会!f=open(‘python招聘数据1.csv’,mode=‘a’,encoding</div> </li> <li><a href="/article/1832302253193654272.htm" title="2024年Python最新Python爬虫入门教程30:爬取拉勾网招聘数据信息(1)" target="_blank">2024年Python最新Python爬虫入门教程30:爬取拉勾网招聘数据信息(1)</a> <span class="text-muted">2401_84584609</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a> <div>Python爬虫入门教程23:A站视频的爬取,解密m3u8视频格式Python爬虫入门教程24:下载某网站付费文档保存PDFPython爬虫入门教程25:绕过JS加密参数,实现批量下载抖某音无水印视频内容Python爬虫入门教程26:快手视频网站数据内容下载Python爬虫入门教程27:爬取某电商平台数据内容并做数据可视化Python爬虫入门教程28:爬取微博热搜榜并做动态数据展示Python爬虫</div> </li> <li><a href="/article/1832288767512244224.htm" title="python爬虫面试真题及答案_Python面试题爬虫篇(附答案)" target="_blank">python爬虫面试真题及答案_Python面试题爬虫篇(附答案)</a> <span class="text-muted">朴少</span> <a class="tag" taget="_blank" href="/search/python%E7%88%AC%E8%99%AB%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%E5%8F%8A%E7%AD%94%E6%A1%88/1.htm">python爬虫面试真题及答案</a> <div>0|1第一部分必答题注意:第31题1分,其他题均每题3分。1,了解哪些基于爬虫相关的模块?-网络请求:urllib,requests,aiohttp-数据解析:re,xpath,bs4,pyquery-selenium-js逆向:pyexcJs2,常见的数据解析方式?-re、lxml、bs43,列举在爬虫过程中遇到的哪些比较难的反爬机制?-动态加载的数据-动态变化的请求参数-js加密-代理-coo</div> </li> <li><a href="/article/1832242249979752448.htm" title="2024年Python最全Python爬虫实战:爬取股票信息_python 获取a股所有代码(1)" target="_blank">2024年Python最全Python爬虫实战:爬取股票信息_python 获取a股所有代码(1)</a> <span class="text-muted">2401_84585339</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a> <div>doc=PyQuery(r.text)list=[]#获取所有section中a节点,并进行迭代foriindoc('.stockTablea').items():try:href=i.attr.hreflist.append(re.findall(r"\d{6}",href)[0])except:continuelist=[item.lower()foriteminlist]#将爬取信息转换小写</div> </li> <li><a href="/article/110.htm" title="强大的销售团队背后 竟然是大数据分析的身影" target="_blank">强大的销售团队背后 竟然是大数据分析的身影</a> <span class="text-muted">蓝儿唯美</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a> <div>Mark Roberge是HubSpot的首席财务官,在招聘销售职位时使用了大量数据分析。但是科技并没有挤走直觉。 大家都知道数理学家实际上已经渗透到了各行各业。这些热衷数据的人们通过处理数据理解商业流程的各个方面,以重组弱点,增强优势。 Mark Roberge是美国HubSpot公司的首席财务官,HubSpot公司在构架集客营销现象方面出过一份力——因此他也是一位数理学家。他使用数据分析 </div> </li> <li><a href="/article/237.htm" title="Haproxy+Keepalived高可用双机单活" target="_blank">Haproxy+Keepalived高可用双机单活</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/1.htm">负载均衡</a><a class="tag" taget="_blank" href="/search/keepalived/1.htm">keepalived</a><a class="tag" taget="_blank" href="/search/haproxy/1.htm">haproxy</a><a class="tag" taget="_blank" href="/search/%E9%AB%98%E5%8F%AF%E7%94%A8/1.htm">高可用</a> <div>我们的应用MyApp不支持集群,但要求双机单活(两台机器:master和slave): 1.正常情况下,只有master启动MyApp并提供服务 2.当master发生故障时,slave自动启动本机的MyApp,同时虚拟IP漂移至slave,保持对外提供服务的IP和端口不变 F5据说也能满足上面的需求,但F5的通常用法都是双机双活,单活的话还没研究过 服务器资源 10.7</div> </li> <li><a href="/article/364.htm" title="eclipse编辑器中文乱码问题解决" target="_blank">eclipse编辑器中文乱码问题解决</a> <span class="text-muted">0624chenhong</span> <a class="tag" taget="_blank" href="/search/eclipse%E4%B9%B1%E7%A0%81/1.htm">eclipse乱码</a> <div>使用Eclipse编辑文件经常出现中文乱码或者文件中有中文不能保存的问题,Eclipse提供了灵活的设置文件编码格式的选项,我们可以通过设置编码 格式解决乱码问题。在Eclipse可以从几个层面设置编码格式:Workspace、Project、Content Type、File 本文以Eclipse 3.3(英文)为例加以说明: 1. 设置Workspace的编码格式: Windows-&g</div> </li> <li><a href="/article/491.htm" title="基础篇--resources资源" target="_blank">基础篇--resources资源</a> <span class="text-muted">不懂事的小屁孩</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>最近一直在做java开发,偶尔敲点android代码,突然发现有些基础给忘记了,今天用半天时间温顾一下resources的资源。 String.xml    字符串资源   涉及国际化问题  http://www.2cto.com/kf/201302/190394.html   string-array</div> </li> <li><a href="/article/618.htm" title="接上篇补上window平台自动上传证书文件的批处理问卷" target="_blank">接上篇补上window平台自动上传证书文件的批处理问卷</a> <span class="text-muted">酷的飞上天空</span> <a class="tag" taget="_blank" href="/search/window/1.htm">window</a> <div> @echo off : host=服务器证书域名或ip,需要和部署时服务器的域名或ip一致 ou=公司名称, o=公司名称 set host=localhost set ou=localhost set o=localhost set password=123456 set validity=3650 set salias=s</div> </li> <li><a href="/article/745.htm" title="企业物联网大潮涌动:如何做好准备?" target="_blank">企业物联网大潮涌动:如何做好准备?</a> <span class="text-muted">蓝儿唯美</span> <a class="tag" taget="_blank" href="/search/%E4%BC%81%E4%B8%9A/1.htm">企业</a> <div>物联网的可能性也许是无限的。要找出架构师可以做好准备的领域然后利用日益连接的世界。 尽管物联网(IoT)还很新,企业架构师现在也应该为一个连接更加紧密的未来做好计划,而不是跟上闸门被打开后的集成挑战。“问题不在于物联网正在进入哪些领域,而是哪些地方物联网没有在企业推进,” Gartner研究总监Mike Walker说。 Gartner预测到2020年物联网设备安装量将达260亿,这些设备在全</div> </li> <li><a href="/article/872.htm" title="spring学习——数据库(mybatis持久化框架配置)" target="_blank">spring学习——数据库(mybatis持久化框架配置)</a> <span class="text-muted">a-john</span> <a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a> <div>Spring提供了一组数据访问框架,集成了多种数据访问技术。无论是JDBC,iBATIS(mybatis)还是Hibernate,Spring都能够帮助消除持久化代码中单调枯燥的数据访问逻辑。可以依赖Spring来处理底层的数据访问。 mybatis是一种Spring持久化框架,要使用mybatis,就要做好相应的配置: 1,配置数据源。有很多数据源可以选择,如:DBCP,JDBC,aliba</div> </li> <li><a href="/article/999.htm" title="Java静态代理、动态代理实例" target="_blank">Java静态代理、动态代理实例</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/Java%E9%9D%99%E6%80%81%E4%BB%A3%E7%90%86/1.htm">Java静态代理</a> <div> 采用Java代理模式,代理类通过调用委托类对象的方法,来提供特定的服务。委托类需要实现一个业务接口,代理类返回委托类的实例接口对象。 按照代理类的创建时期,可以分为:静态代理和动态代理。 所谓静态代理: 指程序员创建好代理类,编译时直接生成代理类的字节码文件。 所谓动态代理: 在程序运行时,通过反射机制动态生成代理类。   一、静态代理类实例: 1、Serivce.ja</div> </li> <li><a href="/article/1126.htm" title="Struts1与Struts2的12点区别" target="_blank">Struts1与Struts2的12点区别</a> <span class="text-muted">asia007</span> <a class="tag" taget="_blank" href="/search/Struts1%E4%B8%8EStruts2/1.htm">Struts1与Struts2</a> <div>1) 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts 2提供一个ActionSupport基类去实现常用的接口。即使Action接口不是必须实现的,只有一个包含execute方法的P</div> </li> <li><a href="/article/1253.htm" title="初学者要多看看帮助文档 不要用js来写Jquery的代码" target="_blank">初学者要多看看帮助文档 不要用js来写Jquery的代码</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a> <div>解析json数据的时候需要将解析的数据写到文本框中,  出现了用js来写Jquery代码的问题;   1, JQuery的赋值  有问题    代码如下: data.username 表示的是:  网易            $("#use</div> </li> <li><a href="/article/1380.htm" title="经理怎么和员工搞好关系和信任" target="_blank">经理怎么和员工搞好关系和信任</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/%E5%9B%A2%E9%98%9F/1.htm">团队</a><a class="tag" taget="_blank" href="/search/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/1.htm">项目管理</a><a class="tag" taget="_blank" href="/search/%E7%AE%A1%E7%90%86/1.htm">管理</a> <div>        产品经理应该有坚实的专业基础,这里的基础包括产品方向和产品策略的把握,包括设计,也包括对技术的理解和见识,对运营和市场的敏感,以及良好的沟通和协作能力。换言之,既然是产品经理,整个产品的方方面面都应该能摸得出门道。这也不懂那也不懂,如何让人信服?如何让自己懂?就是不断学习,不仅仅从书本中,更从平时和各种角色的沟通</div> </li> <li><a href="/article/1507.htm" title="如何为rich:tree不同类型节点设置右键菜单" target="_blank">如何为rich:tree不同类型节点设置右键菜单</a> <span class="text-muted">sunjing</span> <a class="tag" taget="_blank" href="/search/contextMenu/1.htm">contextMenu</a><a class="tag" taget="_blank" href="/search/tree/1.htm">tree</a><a class="tag" taget="_blank" href="/search/Richfaces/1.htm">Richfaces</a> <div>组合使用target和targetSelector就可以啦,如下: <rich:tree id="ruleTree" value="#{treeAction.ruleTree}" var="node" nodeType="#{node.type}" selectionChangeListener=&qu</div> </li> <li><a href="/article/1634.htm" title="【Redis二】Redis2.8.17搭建主从复制环境" target="_blank">【Redis二】Redis2.8.17搭建主从复制环境</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a> <div>开始使用Redis2.8.17 Redis第一篇在Redis2.4.5上搭建主从复制环境,对它的主从复制的工作机制,真正的惊呆了。不知道Redis2.8.17的主从复制机制是怎样的,Redis到了2.4.5这个版本,主从复制还做成那样,Impossible is nothing! 本篇把主从复制环境再搭一遍看看效果,这次在Unbuntu上用官方支持的版本。   Ubuntu上安装Red</div> </li> <li><a href="/article/1761.htm" title="JSONObject转换JSON--将Date转换为指定格式" target="_blank">JSONObject转换JSON--将Date转换为指定格式</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/JSONObject/1.htm">JSONObject</a> <div>项目中,经常会用JSONObject插件将JavaBean或List<JavaBean>转换为JSON格式的字符串,而JavaBean的属性有时候会有java.util.Date这个类型的时间对象,这时JSONObject默认会将Date属性转换成这样的格式:   {"nanos":0,"time":-27076233600000,</div> </li> <li><a href="/article/1888.htm" title="JavaScript语言精粹读书笔记" target="_blank">JavaScript语言精粹读书笔记</a> <span class="text-muted">braveCS</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div>【经典用法】:   //①定义新方法 Function .prototype.method=function(name, func){ this.prototype[name]=func; return this; } //②给Object增加一个create方法,这个方法创建一个使用原对</div> </li> <li><a href="/article/2015.htm" title="编程之美-找符合条件的整数 用字符串来表示大整数避免溢出" target="_blank">编程之美-找符合条件的整数 用字符串来表示大整数避免溢出</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a> <div> import java.util.LinkedList; public class FindInteger { /** * 编程之美 找符合条件的整数 用字符串来表示大整数避免溢出 * 题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0 * * 假设当前正在搜索由0,1组成的K位十进制数</div> </li> <li><a href="/article/2142.htm" title="读书笔记" target="_blank">读书笔记</a> <span class="text-muted">chengxuyuancsdn</span> <a class="tag" taget="_blank" href="/search/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/1.htm">读书笔记</a> <div>1、Struts访问资源 2、把静态参数传递给一个动作 3、<result>type属性 4、s:iterator、s:if c:forEach 5、StringBuilder和StringBuffer 6、spring配置拦截器 1、访问资源 (1)通过ServletActionContext对象和实现ServletContextAware,ServletReque</div> </li> <li><a href="/article/2269.htm" title="[通讯与电力]光网城市建设的一些问题" target="_blank">[通讯与电力]光网城市建设的一些问题</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E9%97%AE%E9%A2%98/1.htm">问题</a> <div>       信号防护的问题,前面已经说过了,这里要说光网交换机与市电保障的关系       我们过去用的ADSL线路,因为是电话线,在小区和街道电力中断的情况下,只要在家里用笔记本电脑+蓄电池,连接ADSL,同样可以上网........     </div> </li> <li><a href="/article/2396.htm" title="oracle 空间RESUMABLE" target="_blank">oracle 空间RESUMABLE</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E7%A9%BA%E9%97%B4%E4%B8%8D%E8%B6%B3/1.htm">空间不足</a><a class="tag" taget="_blank" href="/search/RESUMABLE/1.htm">RESUMABLE</a><a class="tag" taget="_blank" href="/search/%E9%94%99%E8%AF%AF%E6%8C%82%E8%B5%B7/1.htm">错误挂起</a> <div>空间RESUMABLE操作  转 Oracle从9i开始引入这个功能,当出现空间不足等相关的错误时,Oracle可以不是马上返回错误信息,并回滚当前的操作,而是将操作挂起,直到挂起时间超过RESUMABLE TIMEOUT,或者空间不足的错误被解决。 这一篇简单介绍空间RESUMABLE的例子。 第一次碰到这个特性是在一次安装9i数据库的过程中,在利用D</div> </li> <li><a href="/article/2523.htm" title="重构第一次写的线程池" target="_blank">重构第一次写的线程池</a> <span class="text-muted">dieslrae</span> <a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B%E6%B1%A0+python/1.htm">线程池 python</a> <div>最近没有什么学习欲望,修改之前的线程池的计划一直搁置,这几天比较闲,还是做了一次重构,由之前的2个类拆分为现在的4个类. 1、首先是工作线程类:TaskThread,此类为一个工作线程,用于完成一个工作任务,提供等待(wait),继续(proceed),绑定任务(bindTask)等方法 #!/usr/bin/env python # -*- coding:utf8 -*- </div> </li> <li><a href="/article/2650.htm" title="C语言学习六指针" target="_blank">C语言学习六指针</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a> <div>初识指针,简单示例程序: /* 指针就是地址,地址就是指针 地址就是内存单元的编号 指针变量是存放地址的变量 指针和指针变量是两个不同的概念 但是要注意: 通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样 */ # include <stdio.h> int main(void) { int * p; // p是变量的名字, int * </div> </li> <li><a href="/article/2777.htm" title="yii2 beforeSave afterSave beforeDelete" target="_blank">yii2 beforeSave afterSave beforeDelete</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/delete/1.htm">delete</a> <div>public function afterSave($insert, $changedAttributes) { parent::afterSave($insert, $changedAttributes); if($insert) { //这里是新增数据 } else { //这里是更新数据 } }  </div> </li> <li><a href="/article/2904.htm" title="timertask" target="_blank">timertask</a> <span class="text-muted">shuizhaosi888</span> <a class="tag" taget="_blank" href="/search/timertask/1.htm">timertask</a> <div>java.util.Timer timer = new java.util.Timer(true); // true 说明这个timer以daemon方式运行(优先级低, // 程序结束timer也自动结束),注意,javax.swing // 包中也有一个Timer类,如果import中用到swing包, // 要注意名字的冲突。 TimerTask task = new</div> </li> <li><a href="/article/3031.htm" title="Spring Security(13)——session管理" target="_blank">Spring Security(13)——session管理</a> <span class="text-muted">234390216</span> <a class="tag" taget="_blank" href="/search/session/1.htm">session</a><a class="tag" taget="_blank" href="/search/Spring+Security/1.htm">Spring Security</a><a class="tag" taget="_blank" href="/search/%E6%94%BB%E5%87%BB%E4%BF%9D%E6%8A%A4/1.htm">攻击保护</a><a class="tag" taget="_blank" href="/search/%E8%B6%85%E6%97%B6/1.htm">超时</a> <div>session管理 目录   1.1     检测session超时 1.2     concurrency-control 1.3     session 固定攻击保护         </div> </li> <li><a href="/article/3158.htm" title="公司项目NODEJS实践0.3[ mongo / session ...]" target="_blank">公司项目NODEJS实践0.3[ mongo / session ...]</a> <span class="text-muted">逐行分析JS源代码</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/session/1.htm">session</a><a class="tag" taget="_blank" href="/search/nodejs/1.htm">nodejs</a> <div>    http://www.upopen.cn   一、前言         书接上回,我们搭建了WEB服务端路由、模板等功能,完成了register 通过ajax与后端的通信,今天主要完成数据与mongodb的存取,实现注册 / 登录 /</div> </li> <li><a href="/article/3285.htm" title="pojo.vo.po.domain区别" target="_blank">pojo.vo.po.domain区别</a> <span class="text-muted">LiaoJuncai</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/VO/1.htm">VO</a><a class="tag" taget="_blank" href="/search/POJO/1.htm">POJO</a><a class="tag" taget="_blank" href="/search/javabean/1.htm">javabean</a><a class="tag" taget="_blank" href="/search/domain/1.htm">domain</a> <div>  POJO = "Plain Old Java Object",是MartinFowler等发明的一个术语,用来表示普通的Java对象,不是JavaBean, EntityBean 或者 SessionBean。POJO不但当任何特殊的角色,也不实现任何特殊的Java框架的接口如,EJB, JDBC等等。      即POJO是一个简单的普通的Java对象,它包含业务逻辑</div> </li> <li><a href="/article/3412.htm" title="Windows Error Code" target="_blank">Windows Error Code</a> <span class="text-muted">OhMyCC</span> <a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a> <div>0 操作成功完成. 1 功能错误. 2 系统找不到指定的文件. 3 系统找不到指定的路径. 4 系统无法打开文件. 5 拒绝访问. 6 句柄无效. 7 存储控制块被损坏. 8 存储空间不足, 无法处理此命令. 9 存储控制块地址无效. 10 环境错误. 11 试图加载格式错误的程序. 12 访问码无效. 13 数据无效. 14 存储器不足, 无法完成此操作. 15 系</div> </li> <li><a href="/article/3539.htm" title="在storm集群环境下发布Topology" target="_blank">在storm集群环境下发布Topology</a> <span class="text-muted">roadrunners</span> <a class="tag" taget="_blank" href="/search/%E9%9B%86%E7%BE%A4/1.htm">集群</a><a class="tag" taget="_blank" href="/search/storm/1.htm">storm</a><a class="tag" taget="_blank" href="/search/topology/1.htm">topology</a><a class="tag" taget="_blank" href="/search/spout/1.htm">spout</a><a class="tag" taget="_blank" href="/search/bolt/1.htm">bolt</a> <div>storm的topology设计和开发就略过了。本章主要来说说如何在storm的集群环境中,通过storm的管理命令来发布和管理集群中的topology。   1、打包 打包插件是使用maven提供的maven-shade-plugin,详细见maven-shade-plugin。 <plugin> <groupId>org.apache.maven.</div> </li> <li><a href="/article/3666.htm" title="为什么不允许代码里出现“魔数”" target="_blank">为什么不允许代码里出现“魔数”</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>  在一个新项目中,我最先做的事情之一,就是建立使用诸如Checkstyle和Findbugs之类工具的准则。目的是制定一些代码规范,以及避免通过静态代码分析就能够检测到的bug。   迟早会有人给出案例说这样太离谱了。其中的一个案例是Checkstyle的魔数检查。它会对任何没有定义常量就使用的数字字面量给出警告,除了-1、0、1和2。   很多开发者在这个检查方面都有问题,这可以从结果</div> </li> <li><a href="/article/3793.htm" title="zoj 3511 Cake Robbery(线段树)" target="_blank">zoj 3511 Cake Robbery(线段树)</a> <span class="text-muted">阿尔萨斯</span> <a class="tag" taget="_blank" href="/search/%E7%BA%BF%E6%AE%B5%E6%A0%91/1.htm">线段树</a> <div> 题目链接:zoj 3511 Cake Robbery 题目大意:就是有一个N边形的蛋糕,切M刀,从中挑选一块边数最多的,保证没有两条边重叠。 解题思路:有多少个顶点即为有多少条边,所以直接按照切刀切掉点的个数排序,然后用线段树维护剩下的还有哪些点。 #include <cstdio> #include <cstring> #include <vector&</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>