Python-15:爬虫之单线程爬虫
1、Requests的介绍与安装
requests:HTTP for Humans
完美替代Python的urllib2模块
更多的自动化
更友好的用户体验
如何安装:Windows:pip install requests
第三方库的安装技巧
少用easy_install因为只能安装不能卸载
多用pip方式安装
在国内撞墙的时候我们可以使用这个网站:http://www.lfd.uci.edu/~gohlke/pythonlibs/
打开该网站,搜素requests,单击图中红框中的内容将其下载
打开下载的文件目录,将此文件的后缀名从whl改为zip
将其解压,得到requests与requests-2.17.3.dist-info两个文件夹,我们将requests文件夹整体赋值粘贴到C:\Python27\Lib(Python的安装目录下的lib文件夹下)
2、第一个网页爬虫
使用requests获取网页源代码
直接获取源代码
#coding:utf-8 import requests qhmu=requests.get("http://www.cnblogs.com/jiyongxin") print qhmu.text
输出结果
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>小新丶 - 博客园</title> <link type="text/css" rel="stylesheet" href="/bundles/blog-common.css?v=m_FXmwz3wxZoecUwNEK23PAzc-j9vbX_C6MblJ5ouMc1"/> <link id="MainCss" type="text/css" rel="stylesheet" href="/skins/CodingLife/bundle-CodingLife.css?v=s0uk-4nDGKcoZzCtu5RG1QHcsOLuk4tFWHoK2TgaeRE1"/> <link id="mobile-style" media="only screen and (max-width: 768px)" type="text/css" rel="stylesheet" href="/skins/CodingLife/bundle-CodingLife-mobile.css?v=svj45cmFr8dtGVB0Cq4o-6MjM6Bz3Y76mAYaZnSJon01"/> <link title="RSS" type="application/rss+xml" rel="alternate" href="http://www.cnblogs.com/jiyongxin/rss"/> <link title="RSD" type="application/rsd+xml" rel="EditURI" href="http://www.cnblogs.com/jiyongxin/rsd.xml"/> <link type="application/wlwmanifest+xml" rel="wlwmanifest" href="http://www.cnblogs.com/jiyongxin/wlwmanifest.xml"/> <script src="//common.cnblogs.com/script/jquery.js" type="text/javascript"></script> <script type="text/javascript">var currentBlogApp = 'jiyongxin', cb_enable_mathjax=false;var isLogined=false;</script> <script src="/bundles/blog-common.js?v=E1-LyrzANB2jbN9omtnpOHx3eU0Kt3DyislfhU0b5p81" type="text/javascript"></script> </head> <body> <a name="top"></a> <!--done--> <div id="home"> <div id="header"> <div id="blogTitle"> <a id="lnkBlogLogo" href="http://www.cnblogs.com/jiyongxin/"><img id="blogLogo" src="/Skins/custom/images/logo.gif" alt="返回主页" /></a> <!--done--> <h1><a id="Header1_HeaderTitle" class="headermaintitle" href="http://www.cnblogs.com/jiyongxin/">小新丶</a></h1> <h2>小白程序员大杂烩学习之路</h2> </div><!--end: blogTitle 博客的标题和副标题 --> <div id="navigator"> <ul id="navList"> <li><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li> <li><a id="blog_nav_myhome" class="menu" href="http://www.cnblogs.com/jiyongxin/">首页</a></li> <li><a id="blog_nav_newpost" class="menu" rel="nofollow" href="https://i.cnblogs.com/EditPosts.aspx?opt=1">新随笔</a></li> <li><a id="blog_nav_contact" class="menu" rel="nofollow" href="https://msg.cnblogs.com/send/%E5%B0%8F%E6%96%B0%E4%B8%B6">联系</a></li> <li><a id="blog_nav_rss" class="menu" href="http://www.cnblogs.com/jiyongxin/rss">订阅</a> <!--<a id="blog_nav_rss_image" class="aHeaderXML" href="http://www.cnblogs.com/jiyongxin/rss"><img src="//www.cnblogs.com/images/xml.gif" alt="订阅" /></a>--></li> <li><a id="blog_nav_admin" class="menu" rel="nofollow" href="https://i.cnblogs.com/">管理</a></li> </ul> <div class="blogStats"> <div id="blog_stats"> <span id="stats_post_count">随笔 - 18 </span> <span id="stats_article_count">文章 - 0 </span> <span id="stats-comment_count">评论 - 2</span> </div> </div><!--end: blogStats --> </div><!--end: navigator 博客导航栏 --> </div><!--end: header 头部 --> <div id="main"> <div id="mainContent"> <div class="forFlow"> <!--done--> <div class="day"> <div class="dayTitle"> <a id="homepage1_HomePageDays_DaysList_ctl00_ImageLink" href="http://www.cnblogs.com/jiyongxin/archive/2017/06/12.html">2017年6月12日</a> </div> <div class="postTitle"> <a id="homepage1_HomePageDays_DaysList_ctl00_DayList_TitleUrl_0" class="postTitle2" href="http://www.cnblogs.com/jiyongxin/p/6993224.html">Python-15:爬虫之正则表达式应用举例</a> </div> <div class="postCon"><div class="c_b_p_desc">摘要: 首先,我们从最简单的使用python来读取本地文件中的文本内容来开始 1、在本地新建一个html文档,内容如下 2、在与html文件相同目录下创建我们的Python文件,内容如下 3、输出结果为 这样我们就使用Python简单的一句代码将HTML文件读取出来了,那么,我们想要得到HTML中特定的信息<a href="http://www.cnblogs.com/jiyongxin/p/6993224.html" class="c_b_p_desc_readmore">阅读全文</a></div></div> <div class="clear"></div> <div class="postDesc">posted @ 2017-06-12 16:24 小新丶 阅读(2) 评论(0) <a href ="https://i.cnblogs.com/EditPosts.aspx?postid=6993224" rel="nofollow">编辑</a></div> <div class="clear"></div> </div> <div class="day"> <div class="dayTitle"> <a id="homepage1_HomePageDays_DaysList_ctl01_ImageLink" href="http://www.cnblogs.com/jiyongxin/archive/2017/06/07.html">2017年6月7日</a> </div> <div class="postTitle"> <a id="homepage1_HomePageDays_DaysList_ctl01_DayList_TitleUrl_0" class="postTitle2" href="http://www.cnblogs.com/jiyongxin/p/6957997.html">Python-14:爬虫之正则表达式1</a> </div> <div class="postCon"><div class="c_b_p_desc">摘要: 经过一段时间的基础知识铺垫,终于可以开始学习爬虫了,对,就是爬虫,可以爬东西的虫子! 爬虫基础,一个是Python,一个就是正则表达式了,当然,正则表达式在任何时候都不容忽视它的重要性! 接下来,我们从一个破解小密码来开始学习正则表达式 laodhfejzuwxyzixyzladivhwanxyzl<a href="http://www.cnblogs.com/jiyongxin/p/6957997.html" class="c_b_p_desc_readmore">阅读全文</a></div></div> <div class="clear"></div> <div class="postDesc">posted @ 2017-06-07 17:04 小新丶 阅读(9) 评论(0) <a href ="https://i.cnblogs.com/EditPosts.aspx?postid=6957997" rel="nofollow">编辑</a></div> <div class="clear"></div> <div class="postSeparator"></div> <div class="postTitle"> <a id="homepage1_HomePageDays_DaysList_ctl01_DayList_TitleUrl_1" class="postTitle2" href="http://www.cnblogs.com/jiyongxin/p/6957635.html">Python-13:模块</a> </div> <div class="postCon"><div class="c_b_p_desc">摘要: 1、认识Python模块 函数是可以实现一项或多项功能的一段程序,模块是可以实现一项或多项功能的程序块 安装目录下的lib文件夹中都是模块 如何导入模块 使用import关键字,如果使用这个模块必须先导入 sys模块 在Python中有一些模块是不用我们自己去定义的,Python官方提供的自带的模块<a href="http://www.cnblogs.com/jiyongxin/p/6957635.html" class="c_b_p_desc_readmore">阅读全文</a></div></div> <div class="clear"></div> <div class="postDesc">posted @ 2017-06-07 16:14 小新丶 阅读(5) 评论(0) <a href ="https://i.cnblogs.com/EditPosts.aspx?postid=6957635" rel="nofollow">编辑</a></div> <div class="clear"></div> </div> <div class="day"> <div class="dayTitle"> <a id="homepage1_HomePageDays_DaysList_ctl02_ImageLink" href="http://www.cnblogs.com/jiyongxin/archive/2017/05/18.html">2017年5月18日</a> </div> <div class="postTitle"> <a id="homepage1_HomePageDays_DaysList_ctl02_DayList_TitleUrl_0" class="postTitle2" href="http://www.cnblogs.com/jiyongxin/p/6873408.html">使用地图切片并最终将地图发布在arcgis for server</a> </div> <div class="postCon"><div class="c_b_p_desc">摘要: 1、记录好下载的离线地图切片文件夹所在的位置(上个随笔有介绍如何下载离线地图) 2、打开arcmap 3、新建一个空的模板 4、点击add data 5、选择我们下载的切片点击add 6、界面如图所示 7、生成发布所需的文件并在arcgis for server上进行发布 依次点击File-Shar<a href="http://www.cnblogs.com/jiyongxin/p/6873408.html" class="c_b_p_desc_readmore">阅读全文</a></div></div> <div class="clear"></div> <div class="postDesc">posted @ 2017-05-18 14:56 小新丶 阅读(2) 评论(0) <a href ="https://i.cnblogs.com/EditPosts.aspx?postid=6873408" rel="nofollow">编辑</a></div> <div class="clear"></div> <div class="postSeparator"></div> <div class="postTitle"> <a id="homepage1_HomePageDays_DaysList_ctl02_DayList_TitleUrl_1" class="postTitle2" href="http://www.cnblogs.com/jiyongxin/p/6873158.html">使用下载器下载适用于arcgis的离线地图切片</a> </div> <div class="postCon"><div class="c_b_p_desc">摘要: 1、下载太乐地图下载器或水经注离线地图下载器(官网下载为适用版,加水印且控制下载大小) 2、地图下载器界面如下 太乐地图下载器 水经注离线地图下载器 3、两款软件操作类似,我们就以水经注离线地图下载器为例,详解各个步骤 ①点击设置 ②选择在线地图 ③选择自己需要下载的地图,这里以谷歌卫星地图为例(注<a href="http://www.cnblogs.com/jiyongxin/p/6873158.html" class="c_b_p_desc_readmore">阅读全文</a></div></div> <div class="clear"></div> <div class="postDesc">posted @ 2017-05-18 14:25 小新丶 阅读(2) 评论(0) <a href ="https://i.cnblogs.com/EditPosts.aspx?postid=6873158" rel="nofollow">编辑</a></div> <div class="clear"></div> <div class="postSeparator"></div> <div class="postTitle"> <a id="homepage1_HomePageDays_DaysList_ctl02_DayList_TitleUrl_2" class="postTitle2" href="http://www.cnblogs.com/jiyongxin/p/6835990.html">Python-12:Python语法基础-函数</a> </div> <div class="postCon"><div class="c_b_p_desc">摘要: 1、函数 function,通俗来讲函数就是功能,函数是用来封装功能的,函数分为两种类型,一种是系统自带的不用我们编写就可以使用的。另一种函数是自定义的,需要我们编写其功能,这种函数自由度高,叫做自定义函数。 函数的定义: ①声明这个指定的部分是函数 ②编写这个函数的功能 格式:def 函数名():<a href="http://www.cnblogs.com/jiyongxin/p/6835990.html" class="c_b_p_desc_readmore">阅读全文</a></div></div> <div class="clear"></div> <div class="postDesc">posted @ 2017-05-18 14:02 小新丶 阅读(7) 评论(0) <a href ="https://i.cnblogs.com/EditPosts.aspx?postid=6835990" rel="nofollow">编辑</a></div> <div class="clear"></div> </div> <div class="day"> <div class="dayTitle"> <a id="homepage1_HomePageDays_DaysList_ctl03_ImageLink" href="http://www.cnblogs.com/jiyongxin/archive/2017/05/10.html">2017年5月10日</a> </div> <div class="postTitle"> <a id="homepage1_HomePageDays_DaysList_ctl03_DayList_TitleUrl_0" class="postTitle2" href="http://www.cnblogs.com/jiyongxin/p/6835196.html">Python-11:Python语法基础-控制流</a> </div> <div class="postCon"><div class="c_b_p_desc">摘要: 1、Python中的三种控制流 程序中代码的执行是有顺序的,有的代码会从上到下按顺序执行,有的程序代码会跳转着执行,有的程序代码会选择不同的分支执行,有的代码会循环着执行,什么样的程序应该选择分支执行,什么样的代码应该循环着执行,在Python中是有相应的控制语句控制的,控制语句能控制某段代码的执行<a href="http://www.cnblogs.com/jiyongxin/p/6835196.html" class="c_b_p_desc_readmore">阅读全文</a></div></div> <div class="clear"></div> <div class="postDesc">posted @ 2017-05-10 11:51 小新丶 阅读(7) 评论(0) <a href ="https://i.cnblogs.com/EditPosts.aspx?postid=6835196" rel="nofollow">编辑</a></div> <div class="clear"></div> <div class="postSeparator"></div> <div class="postTitle"> <a id="homepage1_HomePageDays_DaysList_ctl03_DayList_TitleUrl_1" class="postTitle2" href="http://www.cnblogs.com/jiyongxin/p/6831564.html">Python-10:Python语法基础-运算符与表达式</a> </div> <div class="postCon"><div class="c_b_p_desc">摘要: 1、Python运算符简介 1)什么是运算符 在Python中经常需要对一个或多个数字进行操作,2+3中的+是运算符,"hello"*20中的*也是运算符 2)运算符有哪些 + - * / ** < > != // % & | ^ ~ >> << <= >= == not and or 3)运算符的<a href="http://www.cnblogs.com/jiyongxin/p/6831564.html" class="c_b_p_desc_readmore">阅读全文</a></div></div> <div class="clear"></div> <div class="postDesc">posted @ 2017-05-10 09:43 小新丶 阅读(7) 评论(0) <a href ="https://i.cnblogs.com/EditPosts.aspx?postid=6831564" rel="nofollow">编辑</a></div> <div class="clear"></div> </div> <div class="day"> <div class="dayTitle"> <a id="homepage1_HomePageDays_DaysList_ctl04_ImageLink" href="http://www.cnblogs.com/jiyongxin/archive/2017/05/09.html">2017年5月9日</a> </div> <div class="postTitle"> <a id="homepage1_HomePageDays_DaysList_ctl04_DayList_TitleUrl_0" class="postTitle2" href="http://www.cnblogs.com/jiyongxin/p/6831239.html">Python-09:Python语法基础-行与缩进</a> </div> <div class="postCon"><div class="c_b_p_desc">摘要: 1、逻辑行和物理行 Python中逻辑行主要指一段代码,在意义上它的行数,而物理行,指的是我们实际看到的行数 2、行中分号的使用规则 在Python中一个物理行一般可以包括多个逻辑行,在一个物理行中编写多个逻辑行的时候,逻辑行与逻辑行用;号隔开。 每个逻辑行是必须要有分号的,但是我们在编写程序的时候<a href="http://www.cnblogs.com/jiyongxin/p/6831239.html" class="c_b_p_desc_readmore">阅读全文</a></div></div> <div class="clear"></div> <div class="postDesc">posted @ 2017-05-09 16:35 小新丶 阅读(8) 评论(0) <a href ="https://i.cnblogs.com/EditPosts.aspx?postid=6831239" rel="nofollow">编辑</a></div> <div class="clear"></div> <div class="postSeparator"></div> <div class="postTitle"> <a id="homepage1_HomePageDays_DaysList_ctl04_DayList_TitleUrl_1" class="postTitle2" href="http://www.cnblogs.com/jiyongxin/p/6830731.html">Python-08:Python语法基础-标识符和对象</a> </div> <div class="postCon"><div class="c_b_p_desc">摘要: 1、什么是标识(zhi)符? Python中我们在编程的时候,起的名字就叫做标识符。其中变量和常量就是标识符的一种 2、标识符的命名规则 ①标识符的第一个字符必须是字母或者下划线,不能是数字或者特殊符号等 ②除了第一个字符外,其他的可以使字母下划线和数字 ③大小写敏感 stuName和stuname<a href="http://www.cnblogs.com/jiyongxin/p/6830731.html" class="c_b_p_desc_readmore">阅读全文</a></div></div> <div class="clear"></div> <div class="postDesc">posted @ 2017-05-09 15:19 小新丶 阅读(7) 评论(0) <a href ="https://i.cnblogs.com/EditPosts.aspx?postid=6830731" rel="nofollow">编辑</a></div> <div class="clear"></div> </div> <div class="topicListFooter"><div id="nav_next_page"><a href="http://www.cnblogs.com/jiyongxin/default.html?page=2">下一页</a></div></div> </div><!--end: forFlow --> </div><!--end: mainContent 主体内容容器--> <div id="sideBar"> <div id="sideBarMain"> <!--done--> <div class="newsItem"> <h3 class="catListTitle">公告</h3> <div id="blog-news"></div><script type="text/javascript">loadBlogNews();</script> </div> <div id="blog-calendar" style="display:none"></div><script type="text/javascript">loadBlogDefaultCalendar();</script> <div id="leftcontentcontainer"> <div id="blog-sidecolumn"></div><script type="text/javascript">loadBlogSideColumn();</script> </div> </div><!--end: sideBarMain --> </div><!--end: sideBar 侧边栏容器 --> <div class="clear"></div> </div><!--end: main --> <div class="clear"></div> <div id="footer"> <!--done--> Copyright ©2017 小新丶 </div><!--end: footer --> </div><!--end: home 自定义的最大容器 --> </body> </html>
修改Http头获取源代码
如果有些网站有反爬虫,会检测你访问的客户端是不是浏览器,如果是浏览器可以进入,不是的话会被拒绝,这时候我们就可以吧我们的爬虫伪装成浏览器
#coding:utf-8 import requests _header={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} qhmu=requests.get("http://jp.tingroom.com/yuedu/yd300p/",headers=_header) qhmu.encoding='utf-8' print qhmu.text
这样,也可以把网页的源代码给弄出来
获取到网页的源代码是第一步,我们最终目的是要获取我们所需要的信息,我们就来扒取到我的博客中的标题
观察我们标题处的代码
<div class="postTitle"> <a XXXXXX>Python-09:Python语法基础-行与缩进</a> </div>
我们可以先找出网页上所有class为postTitle的div,在从找到的内容中根据“>(.*?)</a>”来检索
第一步,先找出所有包括随笔标题的div
#coding:utf-8 import requests import re _header={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} qhmu=requests.get("http://www.cnblogs.com/jiyongxin",headers=_header) qhmu.encoding='utf-8' div_Title=re.findall('<div class="postTitle">(.*?)</div>',qhmu.text,re.S) for each in div_Title: print each
输出结果为
第二步,从div中寻找标题
#coding:utf-8 import requests import re _header={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} qhmu=requests.get("http://www.cnblogs.com/jiyongxin",headers=_header) qhmu.encoding='utf-8' div_Title=re.findall('<div class="postTitle">(.*?)</div>',qhmu.text,re.S) for each in div_Title: a_title=re.findall('>(.*?)</a>',each,re.S) print a_title[0]
输出结果为
成功将所有的标题扒取出来
3、向网页提交数据
Get 与 Post介绍
get:从服务器上获取数据
post:向服务器传送数据
get通过构造url中的参数来实现功能
post是将数据放在header中提交数据
分析目标网站
request的表单提交功能