wordpress搭建小说站,网页制作期末作业网站,稿定设计简单好用的在线设计平台,369网站建设中心参考链接#xff1a; Python中从用户获取多个输入 
Python新手写出漂亮的爬虫代码1  
初到大数据学习圈子的同学可能对爬虫都有所耳闻#xff0c;会觉得是一个高大上的东西#xff0c;仿佛九阳神功和乾坤大挪移一样#xff0c;和别人说“老子会爬虫”#xff0c;就感觉特别…参考链接 Python中从用户获取多个输入 
Python新手写出漂亮的爬虫代码1  
初到大数据学习圈子的同学可能对爬虫都有所耳闻会觉得是一个高大上的东西仿佛九阳神功和乾坤大挪移一样和别人说“老子会爬虫”就感觉特别有逼格但是又不知从何入手这里博主给大家纠正一个误区爬虫并不神秘也不高级是一个非常好上手和掌握的东西当然里面也有很多坑也有很多细节展开说的话其实也蛮复杂的不过它的模式和套路就摆在那里看了小编的博客保证你能爬下你想要的内容。  
一般情况下爬虫分为两种一种是静态爬虫一种是动态爬虫所谓静态爬虫就是大部分信息至少你所需要的那些信息是写在html代码中的而动态爬虫一般都是写在一个json文档中这么说可能不太标准不过初学者这样理解即可这篇博客将会带大家领略静态爬虫下一篇将会讲解动态爬虫。  
补充一句博主曾是忠实的Python2用户不过现在也改到Python3了曾经新的库会在Python2中首先兼容然后要过好久才在Python3中集成现在完全不用担心Python2有了Python3不日就会集成Python3也会在编码方面提供更多遍历推荐新手直接从Python3入手当然二者没有什么太大区别遇到问题问问度娘就可以了了废话不多说我们开始爬虫的第一课  
本篇博文将从以下几个方面进行讲解  - 啥是Html代码  - 怎么从Html代码中定位到我要的东西  - BeautifulSoup神器  - 案例爱卡汽车  啥是Html代码  
所谓的html代码浏览博客的你右手一定在鼠标上好的跟着我左手右手一个慢动作点击右键找到“查看网页源代码”不同浏览器可能这个描述不太一样博主是Chrome不过都差不太多是不是有看到类似下面这个图的一堆不知道是什么鬼的代码  其实你可以按键盘上的F12或者右键选择“检查元素”不同浏览器不同这时浏览器的右侧如果你是360浏览器可能是在下方弹出一个东东类似下面红色框中的区域    
这个东西就是刚才我们看的那个不知道是什么鬼的东西的树状结构看上去会整齐一些。这就是html代码html代码其实就是用许多个Y yyaaaxxxx/Y是的结构将想要输出在页面上的内容包含起来的一种语言。下一个小节将详细介绍这个结构总而言之我们肉眼所看到的东西大部分都来自于html代码html代码的作用简单来说就是程序员用一堆html代码将需要展示的信息放在指定的位置上的一种东西有了html代码才有了你眼前页面上的很多元素当然还有其他方式来将元素展示在页面上如css、js等渲染方式这些我们下一篇会介绍。  
知道我们所需要的信息位于html中那么只需要找到我们需要的具体内容在哪里然后下载下来就大功告成了逻辑就是这么个逻辑所以静态爬虫的关键问题是要准确的解析html代码一般使用BeautifulSoup这个库或者正则表达式。  
怎么从Html代码中定位到我要的东西  
标签  
上一节中提到html代码中都是Y yyaaaxxxx/Y结构一对””我们称之为标签这对标签中通常会有一些内容可能是一个数字一段字符串一个网页链接或者一个图片链接等等总之就是我们在网页上看到的内容。”Y”称之为标签名”yy”为其属性名”aaa”是其属性值”xxxx”是这个标签的内容也就是对应于页面上的信息。一般情况下我们要获取的就是”xxxx”有时我们可能也需要获取标签的属性值”aaa”。标签可能是唯一的也可能是有重复的回看刚才那张树状的标签结构有一种分明的层次感同一层的标签我们称他们互为兄弟标签而一个标签和包含他的标签互为父子标签如果a包含bb包含cd则c是a的后代标签是b的子标签是d的兄弟标签这个名字无所谓的了解一下就好一般标签名可能会重复但标签属性名yy和属性值“aaa”很少重复不过兄弟标签之间可能会出现标签名、属性名、属性值完全相同的情况后面会介绍就是find方法和findAll方法的区别。  
好上实例打开一个网址把http://newcar.xcar.com.cn/257/review/0.htm是爱卡汽车中比亚迪F3的口碑页面鼠标右键选择“检查元素”或者之间按键盘上的F12选择那个鼠标的按钮红色框1然后将鼠标放到评论框附近红色框2如下图所示看到检查元素界面中有一段代码背景色变成了深色如红色框3  每个页面有10条口碑可见这10条口碑均存储在属性名为’class’,属性值为’review_comments_dl’的’div’标签中当然这个标签不是一个“叶节点”也就是说这个标签内部还有其他标签我们进一步看看。看下面的图片。  我们可以看到红框3中有很多相同的标签dl.../dl,他们都是属性名为’class’,属性值为’review_comments_dl’的’div’标签的子标签他们之间互为兄弟标签我们把鼠标放在红框3的位置并选中这时左侧网页的第一条口碑的位置就会变成深色背景也就是说红框3这个标签实际上对应着红框2这个区域中的内容那么我们把红框3再具体的看一看。如下图所示。  可以看到第一条口碑红框中的内容在第一个’dl’标签中红色下划线2同理可以看到第二条口碑在第二个’dl’标签中。再来看看这个’dl’标签他有两个子标签’dt’和’dd’子标签口碑数据位于dd子标签下好的再来看’dd’标签将’dd’标签展开如下图所示。  红框3是该车的第一页的第一条口碑位于dd标签中及图中蓝色下划线dd.../dd 中的内容图中从开头的dd指向红框3标注了“同级”意思是红框3的内容是dd标签的内容而dd标签下还有子标签比如属性为class属性值为useful的div标签里面的内容1034是有多少人觉得这个口碑有用还有一个子标签pp标签的内容是口碑的作者p中有一个子标签aa标签的内容是评论来源如图中的“比亚迪F3论坛”。  
好了现在想必读者已经对通过标签定位信息有所了解了我们再来练习一下我们将口碑页切换到第2页可以看到地址变成了http://newcar.xcar.com.cn/257/review/0/0_2.htm多了一个’0_2’。将’0_2’改成’0_1’就跳回了第一页实际上第一页的真实url是http://newcar.xcar.com.cn/257/review/0/0_1.htm而改成’0_3’就到了第三页。那么我们应该怎么获取该车型的口碑一共有几页呢看下面的图。  依然是在开发者工具视角及按F12弹出的窗口这个视角将鼠标放在尾页这里是122或者‘下一页’上右侧的框中会出现如图所示的画面可以看到尾页122所在的位于属性为class属性值为’pagers’的div标签的倒数第二个子标签中如红框1所示而’下一页’则位于属性为class属性值为’pagers’的div标签的最后一个子标签中如红框2所示。在仔细贯彻一下会发现属性为class属性值为’pagers’的div标签与我们之前寻找口碑的标签dl是兄弟标签位于全部的dl标签的再后面一个也就是说该标签的父标签与dl标签相同即属性名为’class’,属性值为’review_comments_dl’的’div’标签。  
为什么要确定尾页呢因为构造代码时我们要知道代码的起止位置使用for循环良好的控制代码的开始与完结。  
这个爬虫的逻辑是这样的找到目标的车型即其url实际上不同车型的url只有id不同比如比亚迪F3的url是http://newcar.xcar.com.cn/257/其车子id是257当id更改为258时车型就变成了比亚迪F0然后查看html代码明确要爬取的内容的所在位置明确换页规律明确爬虫的起止位置获取尾页信息的html位置然后构造代码。  
BeautifulSoup神器  
Python一个第三方库bs4中有一个BeautifulSoup库是用于解析html代码的换句话说就是可以帮助你更方便的通过标签定位你需要的信息。这里只介绍两个比较关键的方法  
1、find方法和findAll方法  首先BeautifulSoup会先将整个html或者你所指定的html代码编程一个BeautifulSoup对象的实例不懂对象和实例不要紧你只要把它当作是一套你使用F12看到的树形html代码代码就好这个实例可以使用很多方法最常用的就是find和findAll二者的功能是相同的通过find( )的参数即find( )括号中指定的标签名属性名属性值去搜索对应的标签并获取它不过find只获取搜索到的第一个标签而findAll将会获取搜索到的所有符合条件的标签放入一个迭代器实际上是将所有符合条件的标签放入一个listfindAll常用于兄弟标签的定位如刚才定位口碑信息口碑都在dl标签下而同一页的10条口碑对应于10个dl标签这时候用find方法只能获取第一个而findAll会获取全部的10个标签存入一个列表想要获取每个标签的内容只需对这个列表使用一个for循环遍历一遍即可。  
2、get_text()方法  使用find获取的内容不仅仅是我们需要的内容而且包括标签名、属性名、属性值等比如使用find方法获取Y yyaaaxxxx/Y 的内容xxxx使用find后我们会得到整个Y yyaaaxxxx/Y十分冗长实际我们想要的仅仅是这个标签的内容xxxx因此对使用find方法后的对象再使用get_text( )方法就可以得到标签的内容了对应到这里我们通过get_text( )方法就可以得到xxxx了。  
好了铺垫做的差不多了上代码咯~~~  
案例爱卡汽车  
使用Python3需要提前安装bs4库博主的环境是win7Python3Pycharm有时候也用Ubuntu16.04Python3Pycharm很多时候都有人问博主什么ide好用呢jupyter notebookspyderPycharm这里只能和大家说各个ide各有千秋做工程如爬虫使用pycharm肯定是首选如果只是平时的练习写个小程序使用jupyter notebook和spyder就不错总之如果涉及到频繁打印输出结果的东西最好还是用pycharm不要用jupyter notebook不然会很卡。  
言归正传上代码  
两点说明爬虫代码中html代码经常会出现’class’这个属性名而class是python中“类”的关键字而爬虫的find方法对于属性名而言是不需要加引号的如果直接输入class是会出现问题的所以需要注意每次输入class时应当输入为class_即class后加一个下划线  
第二就是下方代码一开始有一个add_header的过程为的是将代码伪装成浏览器。很多网站是反对爬虫程序对其信息进行爬取的所以会禁止一些程序访问他们的网站通过add_header将你的爬虫程序伪装成了浏览器故在网站看来访问它的就不是一个程序而是一个浏览器或者说是一个人类用户了。  
import urllib 
import urllib.request 
from bs4 import BeautifulSoup 
import re 
import random 
import time # 设置目标url使用urllib.request.Request创建请求 
url0  http://newcar.xcar.com.cn/257/review/0.htm 
req0  urllib.request.Request(url0) # 使用add_header设置请求头将代码伪装成浏览器 
req0.add_header(User-Agent,Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36) # 使用urllib.request.urlopen打开页面使用read方法保存html代码 
html0  urllib.request.urlopen(req0).read() # 使用BeautifulSoup创建html代码的BeautifulSoup实例存为soup0 
soup0  BeautifulSoup(html0) # 获取尾页对照前一小节获取尾页的内容看你就明白了 
total_page  int(soup0.find(div,class_ pagers).findAll(a)[-2].get_text()) 
myfile  open(aika_qc_gn_1_1_1.txt,a) 
print(user,来源,认为有用人数,类型,评论时间,comment,sep|,filemyfile) 
for i in list(range(1,total_page1)): # 设置随机暂停时间 stop  random.uniform(1, 3) url  http://newcar.xcar.com.cn/257/review/0/0_  str(i)  .htm req  urllib.request.Request(url) req.add_header(User-Agent,Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36) html  urllib.request.urlopen(req).read() soup  BeautifulSoup(html) contents  soup.find(div, class_review_comments).findAll(dl) l  len(contents) for content in contents: tiaoshu  contents.index(content) try: ss  正在爬取第%d页的第%d的评论网址为%s % (i, tiaoshu  1, url) print(ss) try: comment_jiaodu  content.find(dt).find(em).find(a).get_text().strip().replace(\n,).replace(\t,).replace(\r,) except: comment_jiaodu   try: comment_type0  content.find(dt).get_text().strip().replace(\n,).replace(\t,).replace(\r,) comment_type1  comment_type0.split(【)[1] comment_type  comment_type1.split(】)[0] except: comment_type  好评 # 认为该条评价有用的人数 try: useful  int(content.find(dd).find(div,class_  useful).find(i).find(span).get_text().strip().replace(\n,).replace(\t,).replace(\r,)) except: useful   # 评论来源 try: comment_region  content.find(dd).find(p).find(a).get_text().strip().replace(\n,).replace(\t,).replace(\r,) except: comment_region   # 评论者名称 try: user  content.find(dd).find(p).get_text().strip().replace(\n,).replace(\t,).replace(\r,).split()[-1] except: user   # 评论内容 try: comment_url  content.find(dt).findAll(a)[-1][href] urlc  comment_url reqc  urllib.request.Request(urlc) reqc.add_header(User-Agent, Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36) htmlc  urllib.request.urlopen(reqc).read() soupc  BeautifulSoup(htmlc) comment0  \ soupc.find(div, idmainNew).find(div, class_maintable).findAll(form)[1].find(table,class_t_msg).findAll(tr)[1] try: comment  comment0.find(font).get_text().strip().replace(\n, ).replace(\t, ) except: comment   try: comment_time  soupc.find(div, idmainNew).find(div, class_maintable).findAll(form)[1].find(table, class_t_msg).\ find(div, stylepadding-top: 4px;float:left).get_text().strip().replace(\n,).replace( \t, )[4:] except: comment_time   except: try: comment  content.find(dd).get_text().split(\n)[-1].split(\r)[-1].strip().replace(\n, ).replace(\t,).replace(\r, ).split()[-1] except: comment   # time.sleep(stop) print(user,comment_region,useful,comment_type,comment_time,comment, sep|, filemyfile) except: s  爬取第%d页的第%d的评论失败网址为%s % (i, tiaoshu  1, url) print(s) pass 
myfile.close()  
补充说明一下try——except这个结构看起来有点像if——else的结构是一个非常重要的过程为了使爬虫代码可以良好的运行不至于刚开始爬几分钟就报错这种恶心人的情况需要很好的利用try——except过程。程序会先执行try下的语句如果发生失败就会执行except下的语句你也可以使用多个try——except嵌套的结构完成复杂的情况的覆盖最好要保证你的try——except过程包含了程序会遇到的所有情况那么你的代码就是趋于完美的。  
讲到这里第一节爬虫课程也就到这里了不久之后会介绍动态爬虫如果之后还有时间还会介绍一下selenium这个模拟浏览的库以及爬虫框架还有反爬虫的知识给自己打个广告除了爬虫可近期也会分享一些关于word2vec和fastText文本分类算法的内容读者有什么其他想交流的可以留言~我也是个正在学习路上的仔希望能和各路朋友以及大牛交流。  
目录  Python新手写出漂亮的爬虫代码1 啥是Html代码怎么从Html代码中定位到我要的东西 标签 BeautifulSoup神器案例爱卡汽车 目录