大家好,一键爬取网站源码分享相信很多的网友都不是很明白,包括网站爬取工具也是一样,不过没有关系,接下来就来为大家分享关于一键爬取网站源码分享和网站爬取工具的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
第3章我的第一个爬虫程序
了解了爬虫原理和网页构造后,我们知道了爬虫的任务就是两件事情:请求网页和解析提取信息。本章就从这两个方面入手,首先安装请求和解析网页的Python第三方库,之后将手把手教读者编写一个简单的爬虫程序。
本章涉及的主要知识点如下。
·Python第三方库:学会Python第三方库的概念及安装方法。
·Requests库:学会Requests库的使用原理和方法。
·BeautifulSoup库:学会BeautifulSoup库的使用原理和方法。
·Requests和BeautifulSoup库组合应用:通过本章最后给出的实例,演示如何利用这两大库进行爬虫的方法和技巧。
3.1Python第三方库
本节主要介绍Python第三方库的基本概念和安装方法,通过第三库的使用,才能让爬虫起到事半功倍的效果。
3.1.1Python第三方库的概念
Python之所以强大并逐渐流行起来,一部分原因要归功于Python强大的第三方库。这样用户就不用了解底层的思想,用最少的代码写出最多的功能。就像制造自行车一样,需要:
·铁矿石;
·橡胶;
·扳手等工具。
如果没使用第三库的话,就需要从原始材料开始,一步步制造下去,一个车轮子都不知道要造多久呢!而使用第三方库就不一样了,车轮子和车身都已经制造好了,拼接一下就可以使用了(有些车直接就可以用了)。这种拿来即用的就是Python第三方库。
3.1.2Python第三方库的安装方法
既然Python第三方库如此好用,那么本节就介绍如何安装这些方便的第三方库。
注意:安装步骤以Windows7系统为准。
1.在PyCharm中安装
(1)打开PyCharm,在菜单栏中选择File∣DefalutSettings命令。
(2)在弹出的对话框中选择左侧的ProjectInterpreter选项,在窗口右方选择Python环境。
(3)单击加号按钮添加第三方库。
(4)然后输入第三方库名称,选中需下载的库。
(5)勾选Installtouserssite复选框,然后单击InstallPackage按钮。操作过程如图3.1和图3.2所示。
图3.1PyCharm中安装第三库步骤1
图3.2PyCharm中安装第三库步骤2
在安装完成后,PyCharm会有成功提示。读者也可以通过展开ProjectInterpreter选项查看已经安装的库,单击减号按钮可以卸载不需要的库。
2.在PIP中安装
在安装Python后,PIP也会同时进行安装,我们可以在命令行cmd中输入:
pip–version
如果出现下面提示,则表示PIP成功安装。
pip9.0.1fromD:\\anaconda\\lib\\site-packages(python3.6)
在PIP成功安装之后,在命令行cmd中输入以下代码即可下载第三方库:
pip3installpackagename\r\n后面为下载whl文件的路径
(4)最后在命令行输入:
pip3installlxml-3.7.2-cp35-cp35m-win_amd64.whl\r\nxxxx为导入的库名,例如importrequests
注意:导入BeautifulSoup库的写法为frombs4importBeautifulSoup。
3.2爬虫三大库
讲过了Requests、Lxml和BeautifulSoup库的安装后,本节将依次讲解各个库的说明和使用方法,然后一起完成读者的第一个爬虫小程序。
3.2.1Requests库
Requests库的官方文档指出:让HTTP服务人类。细心的读者会发现,Requests库的作用就是请求网站获取网页数据的。让我们从简单的实例开始,讲解Requests库的使用方法。
importrequests\r\nres=requests.get(‘http://bj.xiaozhu.com/’)pycharm中返回结果为<Response[200]>,说明请求网址成功,若为404,400则请求网址失败\r\nprint(res.text)\r\nget方法加入请求头\r\nprint(res.text)
Requests库不仅有get()方法,还有post()等方法。post()方法用于提交表单来爬取需要登录才能获得数据的网站,这部分内容会在后面章节中学习,这里不再赘述。学习get()方法足够我们爬取大部分的网站了。
Requests库请求并不会“一帆风顺”,当遇到一些情况时,Requests库会抛出错误或者异常,Requests库的错误和异常主要有以下4种。
·Requests抛出一个ConnectionError异常,原因为网络问题(如DNS查询失败、拒绝连接等)。
·Response.raise_for_status()抛出一个HTTPError异常,原因为HTTP请求返回了不成功的状态码(如网页不存在,返回404错误)。
·Requests抛出一个Timeout异常,原因为请求超时。
·Requests抛出一个TooManyRedirects异常,原因为请求超过了设定的最大重定向次数。
所有Requests显式抛出的异常都继承自requests.exceptions.RequestException,当发现这些错误或异常进行代码修改重新再来时,爬虫的程序又开始重新运行了,爬取到的数据又会重新爬取一次,这对于爬虫的效率和质量来说都是不利的。这时,便可通过Python中的try来避免异常了,具体使用方法如下:
importrequests\r\nheaders={\r\nUser-Agent’:’Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36\r\n(KHTML,likeGecko)Chrome/53.0.2785.143Safari/537.36’\r\n}\r\nres=requests.get(‘http://bj.xiaozhu.com/’,headers=headers)\r\ntry:\r\nprint(res.text)\r\nexceptConnectionError:对返回的结果进行解析\r\nprint(soup.prettify())
输出的结果如图3.6所示,看上去与Requests库请求返回的网页源代码类似,但通过BeautifulSoup库解析得到的Soup文档按照标准缩进格式的结构输出,为结构化的数据,为数据的过滤提取做好准备。
图3.6解析Soup文档
BeautifulSoup库除了支持Python标准库中的HTML解析器外,还支持一些第三方的解析器。如表3.1中列出了BeautifulSoup库的主要解析器及相应的优缺点。
表3.1BeautifulSoup库解析器
注意:BeautifulSoup库官方推荐使用lxml作为解析器,因为效率更高。
解析得到的Soup文档可以使用find()和find_all()方法及selector()方法定位需要的元素了。find()和find_all()两个方法用法相似,BeautifulSoup文档中对这两个方法的定义是这样的:
find_all(tag,attibutes,recursive,text,limit,keywords)\r\nfind(tag,attibutes,recursive,text,keywords)
常用的是前两个参数,熟练运用这两个参数,就可以提取出想要的网页信息。
1.find_all()方法
soup.find_all(‘div’,”item”)查找div标签,class=”item”\r\nsoup.find_all(‘div’,class=’item’)\r\nsoup.find_all(‘div’,attrs={“class”:”item”})括号内容通过Chrome复制得到
该方法类似于中国>湖南省>长沙市,从大到小,提取需要的信息,这种方式可以通过Chrome复制得到,如图3.7所示。
图3.7复制selector()方法
(1)鼠标定位到想要提取的数据位置,右击,在弹出的快捷菜单中选择“检查”命令。
(2)在网页源代码中右击所选元素。
(3)在弹出的快捷菜单中选择Copyselector。这时便能得到:
导入相应的库文件\r\nheaders={\r\n’User-Agent’:’Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36\r\n(KHTML,likeGecko)Chrome/53.0.2785.143Safari/537.36’\r\n}请求网页\r\nsoup=BeautifulSoup(res.text,’html.parser’)page_list>ul>li:nth-of-type(1)>div.result_\r\nbtm_con.lodgeunitname>span.result_price>i’)page_list>ul>li>div.result_btm_con.lodgeunitname>span.result_price>i
就可以得到整个页面的所有价格,这样提取的信息为列表,可以通过循环分别打印出来也可以存储起来。
importrequests\r\nfrombs4importBeautifulSoup\r\nheaders={\r\n’User-Agent’:’Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36\r\n(KHTML,likeGecko)Chrome/53.0.2785.143Safari/537.36’\r\n}\r\nres=requests.get(‘http://bj.xiaozhu.com/’,headers=headers)\r\nsoup=BeautifulSoup(res.text,’html.parser’)\r\nprices=soup.select(‘此时prices为列表,需循环遍历\r\nforpriceinprices:\r\nprint(price)
代码运行的结果如图3.8所示。
细心的读者会发现,提取的信息为[<i>898</i>]这种标签,而读者只需要其中的数据,这时用get_text()方法即可获得中间的文字信息。
importrequests\r\nfrombs4importBeautifulSoup\r\nheaders={\r\n’User-Agent’:’Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36\r\n(KHTML,likeGecko)Chrome/53.0.2785.143Safari/537.36’\r\n}\r\nres=requests.get(‘http://bj.xiaozhu.com/’,headers=headers)\r\nsoup=BeautifulSoup(res.text,’html.parser’)\r\nprices=soup.select(‘导入相应的库文件\r\n04\r\n05headers={\r\n06’User-Agent’:’Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36\r\n07(KHTML,likeGecko)Chrome/53.0.2785.143Safari/537.36’\r\n08}定义判断用户性别的函数\r\n11ifclass_name==[‘member_ico1′]:\r\n12return’女’\r\n13else:\r\n14return’男’\r\n15\r\n16defget_links(url):page_list>ul>li>a’)循环出的URL,依次调用get_info()函数\r\n23\r\n24defget_info(url):pricePart>div.day_l>span’)\r\n30imgs=soup.select(‘floatRightBox>div.js_box.clearfix>div.w_\r\n240>h6>a’)\r\n32sexs=soup.select(‘获取信息并通过字典的信息打印\r\n43\r\n44if__name__==’__main__’:构造多页URL\r\n47forsingle_urlinurls:\r\n48get_links(single_url)睡眠2秒
程序运行的部分结果如图3.11所示。
图3.11程序运行结果
代码分析:
(1)第1~3行导入程序需要的库,Requests库用于请求网页获取网页数据。BeautifulSoup用于解析网页数据。time库的sleep()方法可以让程序暂停。
(2)第5~8行通过Chrome浏览器的开发者工具,复制User-Agent,用于伪装为浏览器,便于爬虫的稳定性。
(3)第16~22行定义了get_links()函数,用于获取进入详细页的链接。
传入URL后,进行请求和解析。通过Chrome浏览器的“检查”并“Copyselector”,可以找到进入详细页的URL链接,但URL链接并不是嵌套在标签中,而是在标签的属性信息中,如图3.12所示。
图3.12URL链接位置
前面说到可用get_text()方法获取标签中的文本信息,但标签中的属性信息需要通过get(’attr’)方法获取得到,如图3.12所示,URL链接在href中,这时用get(’href’)便可得到网页的URL。
最后调用get_info()函数,转入的参数为获取到的网页详细页的链接。
(4)第24~42行定义get_info()函数,用于获取网页信息并输出信息。
传入URL后,进行请求和解析。通过Chrome浏览器的“检查”并“Copyselector”,获取相应的信息,由于信息数据为列表数据结构,可以通过多重循环,构造出字典数据结构,输出并打印出来。
注意:字典中的sex调用了judgment_sex()函数。
(5)第10~14行定义judgment_sex()函数,用于判断房东的性别。
10defjudgment_sex(class_name):\r\n11ifclass_name==[‘member_ico1′]:\r\n12return’女’\r\n13else:\r\n14return’男’
如图3.13所示,可以看出房东的性别区分。
图3.13房东性别判断
在图中所示区域通过Chrome浏览器的“检查”可以发现,女房东的信息为<divclass=”member_ico1″></div>,男房东的信息为<divclass=”member_ico”></div>,这时就可以通过class属性来判断房东的性别。
(6)第44~49行为程序的主入口,通过对网页URL的观察,利用列表的推导式构造13个URL,并依次调用get_links()函数,time.sleep(2)的意思是每循环一次,让程序暂停2秒,防止请求网页频率过快而导致爬虫失败。
3.4综合案例2——爬取酷狗TOP500的数据
本节将利用Requests和BeautifulSoup第三方库,爬取酷狗网榜单中酷狗TOP500的信息。
3.4.1爬虫思路分析
(1)本节爬取的内容为酷狗榜单中酷狗TOP500的音乐信息,如图3.14所示。
图3.14酷狗TOP500界面
(2)网页版酷狗不能手动翻页进行下一步的浏览,但通过观察第一页的URL:
http://www.kugou.com/yy/rank/home/1-8888.html
这里尝试把数字1换为数字2,再进行浏览,恰好返回的是第2页的信息(如图3.15所示)。进行多次尝试后,发现更换不同数字即为不同页面,因此只需更改home/后面的数字即可。由于每页显示的为22首歌曲,所以总共需要23个URL。
图3.15第2页URL
(3)需要爬取的信息有排名情况、歌手、歌曲名和歌曲时间,如图3.16所示。
图3.16需获取的网页信息
3.4.2爬虫代码及分析
爬虫代码如下:
01importrequests\r\n02frombs4importBeautifulSoup\r\n03importtime加入请求头\r\n09\r\n10defget_info(url):通过split获取歌手\r\n和歌曲信息\r\n21’time’:time.get_text().strip()\r\n22}\r\n23print(data)获取爬虫信息并按字典格式打印\r\n24\r\n25if__name__==’__main__’:构造多页URL\r\n28forurlinurls:\r\n29get_info(url)睡眠1秒
程序运行的部分结果如图3.17所示。
代码分析:
(1)第1~3行导入程序需要的库,Requests库用于请求网页获取网页数据,BeautifulSoup用于解析网页数据,time库的sleep()方法可以让程序暂停。
(2)第5~8行通过Chrome浏览器的开发者工具,复制User-Agent,用于伪装为浏览器,便于爬虫的稳定性。
(3)第10~23行定义get_info()函数,用于获取网页信息并输出信息。
传入URL后,进行请求和解析。通过Chrome浏览器的“检查”并“Copyselector”,获取相应的信息,由于信息数据为列表数据结构,因此可以通过多重循环,构造出字典数据结构,输出并打印出来。
图3.17程序运行结果
注意:本案例并未完全使用“Copyselector”的全部信息,由于有些标签是固定的,因此选用部分路径即可。
(4)第25~29行为程序的主入口。通过对网页URL的观察,利用列表的推导式构造23个URL,并依次调用get_info()函数,time.sleep(1)的意思是每循环一次,让程序暂停1秒,防止请求网页频率过快而导致爬虫失败。
一键爬取网站源码分享和网站爬取工具的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!
