爬虫几乎已经成为python学习大军中最为庞大的一支,没有之一。html
我很是赞同以爬虫的目的来学习python,或者用python来实现爬虫。python
但是,为何学了python以后,依旧写不了爬虫呢?chrome
没有案例的回答都是骗流量,这一次就来爬一爬本提问的一些信息:浏览器
爬虫通俗来讲就是抓取网页数据,好比说你们都喜欢的妹子图、小视频呀,还有电子书、文字评论、商品详情等等。服务器
只要网页上有的,均可以经过爬虫爬取下来。python爬虫
通常而言,python爬虫须要如下几步:函数
在默认你已经有python基础的前提下,来讲一说如何写代码进行网页请求、解析。学习
网页请求意思是把网页的HTML源码下载下来,以知乎首页为例,通常长这样:url
网页的信息包含在源码里,好比图中的标题“首页-知乎”。3d
好了,接下来咱们一步步按照套路把本问题的信息都爬下来!
这个很容易,该问题的url:https://www.zhihu.com/question/21358581
咱们须要爬取四个信息:
推荐使用chrome浏览器实践,会和本文操做同步。
打开本问题的网页:
按F12键进入开发者页面:
点击开发者页面左上角的‘选择元素’箭头:
而后再点击网页上的问题描述,这时候开发者界面上出现HTML源码:
你想要的问题描述文字,就藏在html源码里:
咱们要爬取的第一个信息已经找到,按照上面步骤,能够找到其它三个信息在html中的位置。
若是你不懂什么是html?为甚么爬信息须要看html?请先看这篇回答:
这一步多是你们最最关心的,由于涉及到python代码。
其实这里对python的要求也仅限于你须要会数据类型、变量、运算符、函数、模块之类的简单语法。
由于咱们会用到好几个第三方库,帮助咱们完成网页请求、解析的工做,你须要作的是知道这些库的使用方法。
若是你对这个过程仍感迷惑,仍推荐先看这篇回答:
Part 1
这里用到的用于网页请求的库是requests,一个很是流行的http请求库。
这里请求的是什么?不是原谅、也不是理解,而是网页的html信息。
服务器收到请求后,会返回相应的网页对象。
Requests库会自动解码来自服务器的内容,大多数 unicode 字符集都能被无缝地解码。
这一切requests都能妥妥地搞定。
咱们来尝试下:
import requests headers = {'User-Agent':你的浏览器headers} # 传入url和请求头 r = requests.get('https://www.zhihu.com/question/21358581',headers=headers) # 响应的内容 print(r.text)
咱们会接收到服务器返回的页面,requests解析后,呈现下面这样子:
这就是咱们须要的html源码呀!
接下来要作的就是从html中抽取咱们须要的四个信息。
Part 2
经过网页请求,咱们获取到响应的html文档,咱们须要的东西都在这个文档里。
可是怎么去抽取信息呢?
XPath 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。
这里用到另外一个有用的库xpath,xpath库可让你轻松的使用XPath语言查找信息。
既然XPath是在XML文档中才能起做用,然而咱们刚刚获取的html只是文本字符串。
因此须要把html文档转换为XPath能够解析的对象:lxml.etree._Element
(xml/html文件树中的一个节点)。
接着上面代码:
# 将html文档转换为XPath能够解析的 s = etree.HTML(r.text)
Part 3
这下咱们可使用xpath库来进行信息的提取了。
xpath的使用方法这里不赘述了,你们能够网上搜搜资料,个半小时也能学会。
这里介绍一种简单的方法,你在开发者页面中找到对应信息的源码后,直接右键复制xpath地址:
但复制的xpath颇有可能会致使获取的信息为空,因此我这里用标签的属性来获取对应文本。
接上面代码:
# 获取问题内容 q_content = s.xpath('//*[@class="QuestionHeader-title"]/text()')[0] # 获取问题描述 q_describe = s.xpath('//*[@class="RichText ztext"]/text()')[0] # 获取关注数和浏览量,这两个属性同样 q_number = s.xpath('//*[@class="NumberBoard-itemValue"]/text()') concern_num = q_number[0] browing_num = q_number[1] # 打印 print('问题:',q_content,'\n','描述:',q_describe,'\n','关注数:',concern_num,'\n','浏览量:',browing_num)
最终呈现的结果:
import requests from lxml import etree headers = {'User-Agent':你的浏览器headers} r = requests.get('https://www.zhihu.com/question/21358581',headers=headers) s = etree.HTML(r.text) # 获取问题内容 q_content = s.xpath('//*[@class="QuestionHeader-title"]/text()')[0] # 获取问题描述 q_describe = s.xpath('//*[@class="RichText ztext"]/text()')[0] # 获取关注数和浏览量,这两个属性同样 q_number = s.xpath('//*[@class="NumberBoard-itemValue"]/text()') concern_num = q_number[0] browing_num = q_number[1] # 打印 print('问题:',q_content,'\n','描述:',q_describe,'\n','关注数:',concern_num,'\n','浏览量:',browing_num)
好了,关于这个问题的信息已经经过python爬下来。
初学的小伙伴本身尝试再多爬些内容,练习requests和xpath的使用,爬虫也就能入门了。