手把手教你入门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/1949945858665541632.htm" title="Python爬虫【五十八章】Python数据清洗与分析全攻略:从Pandas到深度学习的异常检测进阶" target="_blank">Python爬虫【五十八章】Python数据清洗与分析全攻略:从Pandas到深度学习的异常检测进阶</a> <span class="text-muted">程序员_CLUB</span> <a class="tag" taget="_blank" href="/search/Python%E5%85%A5%E9%97%A8%E5%88%B0%E8%BF%9B%E9%98%B6/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/pandas/1.htm">pandas</a> <div>目录背景与需求分析第一章:结构化数据清洗实战(Pandas核心技法)1.1数据去重策略矩阵1.2智能缺失值处理体系第二章:深度学习异常检测进阶2.1自动编码器异常检测(时序数据)2.2图神经网络异常检测(关系型数据)第三章:综合案例实战案例1:金融交易反欺诈系统案例2:工业传感器异常检测第四章:性能优化与工程实践4.1大数据处理加速技巧4.2模型部署方案第五章:方法论总结与展望5.1方法论框架5.</div> </li> <li><a href="/article/1949945732429574144.htm" title="Python爬虫【三十五章】爬虫高阶:基于Docker集群的动态页面自动化采集系统实战" target="_blank">Python爬虫【三十五章】爬虫高阶:基于Docker集群的动态页面自动化采集系统实战</a> <span class="text-muted">程序员_CLUB</span> <a class="tag" taget="_blank" href="/search/Python%E5%85%A5%E9%97%A8%E5%88%B0%E8%BF%9B%E9%98%B6/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/docker/1.htm">docker</a> <div>目录一、技术演进与行业痛点二、核心技术栈深度解析2.1动态渲染三件套2.2Docker集群架构设计2.3自动化调度系统三、进阶实战案例3.1电商价格监控系统1.技术指标对比2.实现细节3.2新闻聚合平台1.WebSocket监控2.字体反爬破解四、性能优化与运维方案4.1资源消耗对比测试4.2集群运维体系五、总结与未来展望六、Python爬虫相关文章(推荐)一、技术演进与行业痛点在Web3.0时代</div> </li> <li><a href="/article/1949945604893372416.htm" title="Python爬虫【三十二章】爬虫高阶:动态页面处理与Scrapy+Selenium+BeautifulSoup分布式架构深度解析实战" target="_blank">Python爬虫【三十二章】爬虫高阶:动态页面处理与Scrapy+Selenium+BeautifulSoup分布式架构深度解析实战</a> <span class="text-muted"></span> <div>目录引言一、动态页面爬取的技术背景1.1动态页面的核心特征1.2传统爬虫的局限性二、技术选型与架构设计2.1核心组件分析2.2架构设计思路1.分层处理2.数据流三、代码实现与关键技术3.1Selenium与Scrapy的中间件集成3.2BeautifulSoup与ScrapyItem的整合3.3分布式爬取实现3.3.1Scrapy-Redis部署3.3.2多节点启动四、优化与扩展4.1性能优化策略</div> </li> <li><a href="/article/1949945605325385728.htm" title="Python爬虫【三十三章】爬虫高阶:动态页面破解与验证码OCR识别全流程实战" target="_blank">Python爬虫【三十三章】爬虫高阶:动态页面破解与验证码OCR识别全流程实战</a> <span class="text-muted">程序员_CLUB</span> <a class="tag" taget="_blank" href="/search/Python%E5%85%A5%E9%97%A8%E5%88%B0%E8%BF%9B%E9%98%B6/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/ocr/1.htm">ocr</a> <div>目录一、技术背景与行业痛点二、核心技术与实现路径2.1动态页面处理方案对比2.2Selenium深度集成实践2.3OCR验证码破解方案1.预处理阶段:2.识别阶段:3.后处理阶段三、典型应用场景解析3.1电商价格监控系统1.技术架构2.实现效果3.2社交媒体舆情分析1.特殊挑战2.优化方案:四、合规性与风险控制五、总结Python爬虫相关文章(推荐)一、技术背景与行业痛点在Web3.0时代,网站反</div> </li> <li><a href="/article/1949945606000668672.htm" title="Python爬虫【三十四章】爬虫高阶:动态页面处理与Playwright增强控制深度解析" target="_blank">Python爬虫【三十四章】爬虫高阶:动态页面处理与Playwright增强控制深度解析</a> <span class="text-muted">程序员_CLUB</span> <a class="tag" taget="_blank" href="/search/Python%E5%85%A5%E9%97%A8%E5%88%B0%E8%BF%9B%E9%98%B6/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>目录一、技术演进背景与行业挑战二、核心技术栈深度解析2.1动态渲染双引擎架构2.2浏览器指纹伪装方案2.3BeautifulSoup集成实践三、进阶应用场景突破3.1电商价格监控系统3.1.1技术架构创新3.1.2实现效果3.2社交媒体舆情分析3.2.1无限滚动模拟3.2.2WebSocket监控3.2.3Canvas指纹防护四、性能优化与合规方案4.1资源消耗对比测试4.2反爬对抗升级方案五、总</div> </li> <li><a href="/article/1949943967034437632.htm" title="Python爬虫【三十一章】爬虫高阶:动态页面处理与Scrapy+Selenium+Celery弹性伸缩架构实战" target="_blank">Python爬虫【三十一章】爬虫高阶:动态页面处理与Scrapy+Selenium+Celery弹性伸缩架构实战</a> <span class="text-muted"></span> <div>目录引言一、动态页面爬取的技术挑战1.1动态页面的核心特性1.2传统爬虫的局限性二、Scrapy+Selenium:动态爬虫的核心架构2.1技术选型依据2.2架构设计2.3代码实现示例三、Celery:分布式任务队列的引入3.1为什么需要Celery?3.2Celery架构设计3.3代码实现示例3.4Scrapy与Celery的集成四、优化与扩展4.1性能优化4.2分布式部署4.3反爬对抗五、总结</div> </li> <li><a href="/article/1949895033859665920.htm" title="Python爬虫IP被封的5种解决方案" target="_blank">Python爬虫IP被封的5种解决方案</a> <span class="text-muted"></span> <div>前言做爬虫的朋友都遇到过这种情况:程序跑得好好的,突然就开始返回403错误,或者直接连接超时。十有八九是IP被网站封了。现在的网站反爬虫越来越严格,稍微频繁一点就会被拉黑。今天分享几个实用的解决方案,都是我在实际项目中用过的。方案一:代理IP池这是最直接的办法,换个马甲继续干活。基本实现importrequestsimportrandomimporttimeclassProxyPool:def__</div> </li> <li><a href="/article/1949893017594818560.htm" title="Python爬虫实战:研究picloud相关技术" target="_blank">Python爬虫实战:研究picloud相关技术</a> <span class="text-muted">ylfhpy</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%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><a class="tag" taget="_blank" href="/search/picloud/1.htm">picloud</a> <div>一、引言1.1研究背景与意义在数字化时代,网络数据已成为企业决策、学术研究和社会服务的重要资源。爬虫技术作为自动化获取网络信息的关键手段,在舆情监测、市场分析、学术研究等领域具有广泛应用。Python以其简洁的语法和丰富的爬虫库(如Requests、BeautifulSoup、Scrapy)成为爬虫开发的首选语言。然而,面对海量数据和高并发需求,本地爬虫系统往往面临性能瓶颈。picloud作为专业</div> </li> <li><a href="/article/1949893018341404672.htm" title="Python爬虫实战:研究flanker相关技术" target="_blank">Python爬虫实战:研究flanker相关技术</a> <span class="text-muted">ylfhpy</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%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><a class="tag" taget="_blank" href="/search/flanker/1.htm">flanker</a> <div>1.引言1.1研究背景与意义在当今信息爆炸的时代,互联网上的数据量呈现出指数级增长的趋势。如何从海量的网页数据中高效地获取有价值的信息,成为了一个重要的研究课题。网络爬虫作为一种自动获取网页内容的技术,能够帮助用户快速、准确地收集所需的信息,因此在信息检索、数据挖掘、舆情分析等领域得到了广泛的应用。Flanker技术是一种基于文本分析的信息提取技术,它能够从非结构化的文本中识别和提取出特定类型的信</div> </li> <li><a href="/article/1949892890675179520.htm" title="Python爬虫实战入门:手把手教你抓取豆瓣电影TOP250" target="_blank">Python爬虫实战入门:手把手教你抓取豆瓣电影TOP250</a> <span class="text-muted">xiaobindeshijie7</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><a class="tag" taget="_blank" href="/search/%E5%85%B6%E4%BB%96/1.htm">其他</a> <div>文章目录一、环境准备(5分钟搞定)二、第一个爬虫实战(超简单版)2.1基础版代码2.2代码解剖(新人必看)三、突破反爬机制(实战精华)3.1伪装大法3.2请求频率控制3.3代理IP使用四、数据存储(多种姿势)4.1CSV存储4.2MySQL存储五、进阶技巧(高手必备)5.1异步爬虫5.2Selenium动态渲染六、法律与伦理(超级重要!!!)七、下一步学习路线一、环境准备(5分钟搞定)工欲善其事必</div> </li> <li><a href="/article/1949885953996812288.htm" title="BeautifulSoup库深度解析:Python高效解析网页数据的秘籍" target="_blank">BeautifulSoup库深度解析:Python高效解析网页数据的秘籍</a> <span class="text-muted"></span> <div>在Python爬虫开发领域,获取网页内容后,如何高效解析并提取所需数据是关键一环。BeautifulSoup库凭借其简洁易用、功能强大的特点,成为众多开发者解析网页数据的首选工具。本文将深入剖析BeautifulSoup库,通过丰富的实例,帮助你掌握其核心功能与使用技巧,实现网页数据的精准提取。一、认识BeautifulSoup库BeautifulSoup是Python的一个第三方库,主要用于解析</div> </li> <li><a href="/article/1949884187657957376.htm" title="Python网络爬虫技术深度解析:从入门到高级实战" target="_blank">Python网络爬虫技术深度解析:从入门到高级实战</a> <span class="text-muted">Python爬虫项目</span> <a class="tag" taget="_blank" href="/search/2025%E5%B9%B4%E7%88%AC%E8%99%AB%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE/1.htm">2025年爬虫实战项目</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/easyui/1.htm">easyui</a><a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</a> <div>1.爬虫技术概述网络爬虫(WebCrawler)是一种自动化程序,通过模拟人类浏览行为从互联网上抓取、解析和存储数据。根据应用场景可分为:通用爬虫:如搜索引擎的蜘蛛程序聚焦爬虫:针对特定领域的数据采集增量式爬虫:只抓取更新内容深层网络爬虫:处理需要交互的动态内容2.2024年Python爬虫技术栈技术分类推荐工具适用场景基础请求库requests,httpx静态页面请求解析库BeautifulSo</div> </li> <li><a href="/article/1949630514302349312.htm" title="Python爬虫“折戟”真相大揭秘:数据获取失败全剖析" target="_blank">Python爬虫“折戟”真相大揭秘:数据获取失败全剖析</a> <span class="text-muted"></span> <div>爬虫数据获取:理想与现实的落差**在数据驱动的时代,数据宛如一座蕴藏无限价值的宝藏矿山,而Python爬虫则是我们深入矿山挖掘宝藏的得力工具。想象一下,你精心编写了一段Python爬虫代码,满心期待着它能像勤劳的矿工一样,源源不断地从网页中采集到你所需要的数据。当一切准备就绪,代码开始运行,那跳动的进度条仿佛是希望的脉搏。有时候现实却给我们泼了一盆冷水。原本期待着收获满满一桶数据,结果得到的却是寥</div> </li> <li><a href="/article/1949630514797277184.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>一、引言**在大数据时代,数据就是价值的源泉。而Python爬虫,作为数据获取的得力助手,凭借Python简洁的语法和丰富强大的库,在众多领域发挥着重要作用。无论是电商领域的价格监测、市场调研中的数据收集,还是学术研究里的文献获取,Python爬虫都能大显身手。例如,通过爬取电商平台的商品信息,我们可以分析市场趋势,为企业决策提供有力支持;在学术研究中,利用爬虫获取大量文献资料,能帮助研究人员快速</div> </li> <li><a href="/article/1949594196826451968.htm" title="Python移动端爬虫实战:模拟User-Agent与反反爬策略全解析" target="_blank">Python移动端爬虫实战:模拟User-Agent与反反爬策略全解析</a> <span class="text-muted">Python爬虫项目</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><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/%E5%AE%BD%E5%BA%A6%E4%BC%98%E5%85%88/1.htm">宽度优先</a> <div>摘要本文将深入探讨2024年最新的Python移动端爬虫技术,重点讲解如何通过模拟移动设备User-Agent绕过网站反爬机制。文章包含移动端爬虫的优势分析、最新User-Agent库使用、完整移动端爬虫实现、高级反反爬技巧以及移动端爬虫的伦理法律考量,并附有多个实战代码示例。关键词:Python爬虫、移动端爬虫、User-Agent、反反爬、selenium-wire、playwright1.移</div> </li> <li><a href="/article/1949535591863480320.htm" title="Python爬虫处理网页弹框的几种方式,你一定需要!" target="_blank">Python爬虫处理网页弹框的几种方式,你一定需要!</a> <span class="text-muted">梓栋Code</span> <div>在项目开发的时候,要处理弹框,现在将几种处理弹框的方式总结一下:第一种:浏览器式弹框处理这种主要使用于网页驱动浏览器的弹框defdeal_elert_window(self):"""#处理elert弹窗如果账号密码输入错误的就不会出现elert弹窗:return:"""try:#等待alert弹出框可见,这个可以当做判断条件WebDriverWait(self.driver,3,0.5).unti</div> </li> <li><a href="/article/1949507316541878272.htm" title="Python爬虫实战:使用Selenium与反反爬技术高效爬取大众点评餐厅数据" target="_blank">Python爬虫实战:使用Selenium与反反爬技术高效爬取大众点评餐厅数据</a> <span class="text-muted">Python爬虫项目</span> <a class="tag" taget="_blank" href="/search/2025%E5%B9%B4%E7%88%AC%E8%99%AB%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE/1.htm">2025年爬虫实战项目</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/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/okhttp/1.htm">okhttp</a><a class="tag" taget="_blank" href="/search/scrapy/1.htm">scrapy</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/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a> <div>摘要本文将详细介绍如何使用Python爬虫技术获取大众点评网站上的餐厅评分数据。我们将采用Selenium模拟浏览器行为,结合反反爬策略,实现高效、稳定的数据采集。文章包含完整的代码实现、技术解析以及数据处理方法,适合中高级Python开发者学习现代网页爬虫技术。1.引言在当今大数据时代,餐饮行业的数据分析变得越来越重要。大众点评作为中国领先的本地生活信息及交易平台,积累了海量餐厅评价数据。这些数</div> </li> <li><a href="/article/1949402178745593856.htm" title="Python爬虫实战:研究netaddr库相关技术构建IP地址信息采集分析系统" target="_blank">Python爬虫实战:研究netaddr库相关技术构建IP地址信息采集分析系统</a> <span class="text-muted">ylfhpy</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%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><a class="tag" taget="_blank" href="/search/netaddr/1.htm">netaddr</a> <div>1.引言在当今数字化时代,网络空间中的IP地址信息是网络管理、安全分析和资源分配的重要基础。Python作为一种功能强大的编程语言,提供了丰富的库和工具来处理网络数据。其中,爬虫技术可以自动从互联网上获取各种信息,而netaddr库则专门用于IP地址的解析、转换和计算。本文将通过一个实际案例,详细介绍如何使用Python的爬虫技术结合netaddr库构建一个IP地址分析系统。该系统能够从特定网站采</div> </li> <li><a href="/article/1949116959828275200.htm" title="用Python爬取中国航空客运量统计数据:从采集到可视化的完整实战教程" target="_blank">用Python爬取中国航空客运量统计数据:从采集到可视化的完整实战教程</a> <span class="text-muted">Python爬虫项目</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</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/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/websocket/1.htm">websocket</a> <div>一、项目背景与目标随着中国经济的不断发展,航空运输作为国家基础设施的重要组成部分,承载了大量客运流量。了解航空客运量的变化趋势,对经济研究、交通预测、城市规划、投资分析等具有重要意义。然而,公开完整的航空客运数据常分布在不同的网站或动态页面中,不利于直接抓取和分析。因此,我们设计了一个Python爬虫项目,目标是:自动爬取中国民用航空局官网或其公开平台上公布的航空客运量月度数据;实现结构化数据提取</div> </li> <li><a href="/article/1949076969215815680.htm" title="Python 爬虫进阶:优化代码设计,实现高效爬取与存储" target="_blank">Python 爬虫进阶:优化代码设计,实现高效爬取与存储</a> <span class="text-muted"></span> <div>随着数据的不断增多,爬虫技术已成为数据获取和数据挖掘中不可或缺的一部分。对于简单的爬虫来说,代码实现相对简单,但当爬取目标网站的数据量增大时,如何优化代码设计、提高爬取效率、确保数据的准确存储和避免被封禁,就成了爬虫开发中的关键问题。本篇文章将深入探讨如何优化Python爬虫的设计,主要关注以下几个方面:高效的网页爬取:如何提升爬虫的抓取效率。代码模块化设计:如何将爬虫任务拆解成可复用的模块。并发</div> </li> <li><a href="/article/1949076842904350720.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>在信息化时代,网络上的数据量巨大,爬虫技术成为了获取网页信息的利器。对于许多从事数据分析、研究和新闻行业的人来说,能够高效抓取特定网页上的文章标题和内容,尤其是包含某些关键词的文章,是非常有价值的。本文将通过一个实际的Python爬虫案例,介绍如何高效抓取多篇含有关键词的文章标题和内容。我们将使用Python的爬虫库(如requests、BeautifulSoup)来抓取网页数据,同时使用正则表达</div> </li> <li><a href="/article/1948958329871069184.htm" title="用Python爬虫玩转数据可视化(实战向)" target="_blank">用Python爬虫玩转数据可视化(实战向)</a> <span class="text-muted"></span> <div>文章目录一、先来点有意思的!二、开整!数据抓取部分2.1选个软柿子捏2.2数据提取黑科技三、数据清洗骚操作3.1温度数据大改造3.2风力等级提取四、可视化ShowTime!4.1折线图基础款4.2进阶版热力图4.3动态图表黑科技五、避坑指南(血泪经验)六、还能玩得更花吗?七、完整代码哪里找?八、说点掏心窝的话一、先来点有意思的!你相不相信只需要30行代码,就能把网页上的原始数据变成酷炫的图表?今天</div> </li> <li><a href="/article/1948848162072489984.htm" title="Python爬虫实战:研究Talon相关技术构建电商爬虫系统" target="_blank">Python爬虫实战:研究Talon相关技术构建电商爬虫系统</a> <span class="text-muted">ylfhpy</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%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><a class="tag" taget="_blank" href="/search/Talon/1.htm">Talon</a> <div>1.引言1.1研究背景与意义随着互联网数据量的指数级增长,从非结构化网页内容中自动提取有价值的结构化信息成为数据科学领域的关键挑战。传统网络爬虫技术在处理复杂网页结构(如动态加载内容、嵌套表格)时面临提取准确率低、维护成本高的问题。Talon作为一种基于规则的信息提取工具,能够通过定义明确的语法规则识别网页数据模式,但需要与高效的爬虫框架相结合才能发挥最大效用。本研究通过整合Python爬虫生态与</div> </li> <li><a href="/article/1948801884387078144.htm" title="零依赖Python爬虫代码,已通过100%黑盒测试,保证复制即用:" target="_blank">零依赖Python爬虫代码,已通过100%黑盒测试,保证复制即用:</a> <span class="text-muted">黑科技Python</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>#-*-coding:utf-8-*-"""终极零依赖爬虫解决方案验证结果:已通过32种异常场景测试最后更新:2025-7-26"""importurllib.requestimporturllib.errorimporthashlibimporttimeimportrandomclassUltraCrawler:"""</div> </li> <li><a href="/article/1948791034402107392.htm" title="Python 爬虫性能优化实战:从请求压缩到并发提速,抓取效率翻倍技巧" target="_blank">Python 爬虫性能优化实战:从请求压缩到并发提速,抓取效率翻倍技巧</a> <span class="text-muted">Python核芯</span> <a class="tag" taget="_blank" href="/search/Python%E7%88%AC%E8%99%AB%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE/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/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a> <div>一、前言在数据抓取的世界中,爬虫的性能至关重要。无论是处理大规模数据还是应对高频率的请求,一个高效、稳定的爬虫可以大大节省时间和资源。本文将从多个角度探讨如何优化Python爬虫的性能,包括请求压缩、并发提速、缓存策略等,帮助你将爬虫的抓取效率提升到一个新的水平。在实际的爬虫开发中,性能优化是一个不可或缺的环节。一个低效的爬虫可能会导致请求超时、服务器拒绝服务,甚至触发反爬机制。因此,优化爬虫性能</div> </li> <li><a href="/article/1948777926640070656.htm" title="明星新闻与活动爬取:多源网站聚合抓取 + 增量更新策略" target="_blank">明星新闻与活动爬取:多源网站聚合抓取 + 增量更新策略</a> <span class="text-muted">Python核芯</span> <a class="tag" taget="_blank" href="/search/Python%E7%88%AC%E8%99%AB%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE/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><a class="tag" taget="_blank" href="/search/%E6%98%8E%E6%98%9F/1.htm">明星</a><a class="tag" taget="_blank" href="/search/%E6%96%B0%E9%97%BB/1.htm">新闻</a> <div>前言在当今信息爆炸的时代,明星新闻和活动信息的更新速度极快,粉丝们常常需要在多个网站之间来回切换,以获取最新的消息。作为一名Python爬虫开发者,我决定通过编写一个Python爬虫程序,实现多源网站的明星新闻与活动信息聚合抓取,并结合增量更新策略,让粉丝们能够在一个平台上获取到最新、最全的资讯。接下来,我将详细介绍整个爬虫项目的开发过程。一、项目概述本项目的目标是从多个知名的娱乐新闻网站(如新浪</div> </li> <li><a href="/article/1948751832398491648.htm" title="Python爬虫入门:手把手教你抓取新闻资讯网站" target="_blank">Python爬虫入门:手把手教你抓取新闻资讯网站</a> <span class="text-muted">vvbgcc</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> <div>一、准备工作安装Python:确保你的电脑上安装了Python,建议使用Python3.x版本。可以在Python官方网站下载并安装。安装必要的库:使用pip安装以下库:pipinstallrequestsbeautifulsoup4​二、了解目标网站选择一个新闻资讯网站,例如一个简单的新闻页面(如“https://news.ycombinator.com/”),我们将从中提取新闻标题和链接。三、</div> </li> <li><a href="/article/1948733300940009472.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/%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE%E5%A4%A7%E6%8F%AD%E7%A7%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%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a> <div>Python爬虫前沿技术深度探索:云原生架构与智能对抗系统标题:云原生时代Python爬虫架构设计与智能对抗实战开篇:云原生重构爬虫技术栈“当传统爬虫还在单机挣扎时,云原生架构已将采集效率提升100倍!”据2024年云计算峰会数据,采用云原生技术的爬虫系统平均资源利用率达78%,而传统架构仅为12%。本文将带您深入:Serverless爬虫:按需付费的零成本采集方案边缘计算:全球分布式节点部署实战</div> </li> <li><a href="/article/1948717162441011200.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><a class="tag" taget="_blank" href="/search/%E6%8B%9B%E8%81%98%E7%BD%91%E7%AB%99/1.htm">招聘网站</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E5%8F%96%E6%95%B0%E6%8D%AE/1.htm">爬取数据</a> <div>当你学会使用Python爬虫之后就会发现想要得到某些数据再也不用自己费力的去寻找,今天小千就给大家介绍一个很实用的爬虫案例,获取Boss直聘上面的招聘信息,同学们一起来学习一下了。Boss直聘爬虫案例这次我们以北京地区的销售岗位为案例,打开Boss直聘搜索【销售】,但是很遗憾boss直聘的反爬措施不能直接使用requests库获取信息,所以采用webdriver自动化方式获取网页源代码。webdr</div> </li> <li><a href="/article/1948707959479529472.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><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a> <div>引言在如今竞争激烈的就业市场中,企业和招聘机构需要高效地筛选简历,以找到合适的人才。本文将介绍如何构建一个自动化的简历信息抓取系统,帮助用户从招聘网站中高效提取求职者的简历信息。我们将使用Python编程语言,通过现代的爬虫技术,实现数据的抓取和存储。目录引言1.数据需求与目标网站1.1数据需求2.确定抓取策略2.1分析目标网页2.2确定爬取方式3.环境准备4.数据抓取4.1使用requests和</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>