注:本文仅适用于爬虫初级入门者,并不涉及太多技术本质
感谢您阅读此文。最近放假在家,闲时无聊,开始入门了python爬虫,可以完成一些基本的数据爬取(对于一些反爬取例如JS渲染,接口加密等页面仍然处于学习之中),本文就是简单总结最近已熟练掌握的爬取静态网页的方法。
若是从未接触过相关知识的朋友,在开始之前,需至少掌握python入门知识,详见廖雪峰的官方网站,另外若要深入探究爬虫的本质以及希望更好地爬取所需数据的朋友,那么就需要熟悉web前端知识(HTML,JS,CSS,jQ,Ajax等),在此文中并不会过深涉及,故不加阐述。
接下来简单介绍一下BeautifulSoup库和requests库(另外还需安装lxml库):
Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下: Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档本身就没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。详见BeautifulSoup4.2.0官方文档。
Requests 是用Python语言编写,基于 urllib 的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,可以满足 HTTP 测试需求。可参照Python第三方库request详解这篇文章。
接下来我们就开始从爬取网易云课堂上计算机专业所需课程以简单示范:
1.首先,导入我们所需的库:
from bs4 import BeautifulSoupimport requests
2.接着我们用url确定我们的目标网址:
url='/curricula/cs.htm'
URL是统一资源定位符,基本URL包含协议、服务器名称(或IP地址)、路径和文件名,如“协议://授权/路径?查询”
而我们加载网页的过程基本就是客户端向服务器以某一方式发送request,而服务器处理后,会给我们response
而请求方式有多种:get,post,head,put,options等等,而一般常用的只有get和post两种,对于一般的网页,我们通常只使用get方式即可。get和post的区别-知乎
3.接下来,我们开始利用requests.get()来获取网页并利用bs4解析网页:
response=requests.get(url)soup=BeautifulSoup(response.text,'lxml')
soup=BeautifulSoup(html #目标网址文本内容# ,’lxml’#解析器# )
4.此时,我们就需要人工到目标网站上寻找自己想要的数据的位置:
基本步骤:进入网页后,打开开发者工具(F12),or右键点击网页检查,or直接找到需要的内容右键检查
我们希望把计算机专业在大学本科阶段的所有课程全部爬取下来,那么我们就要找到所需数据的定位位置,复制它的定位路径无论是类名还是selector路径等都可以,关键是要满足我们可以通过它来准确找到所需要的数据。
而在获取同一类数据时,我们要注意观察他们之间的标签等有没有共同点,分析出后即可利用select()统一筛选放入list。
而常用的路径描述有两种:CSS Selector和XPATH,而soup.select()不支持XPATH。select方法详解。
经过分析,我们发现所有课程有两种不同的特征路径,利用这两种特征路径找到路径,我们就可以筛选出所需数据了:
data0=soup.select('span.f-thide.cataName.f-ib')data1=soup.select('#j-package > div > div > div > a')
5.最后我们需要把数据打印出来:
for x in data0:print(x.get_text())for y in data1:print(y.get_text())
此处由于我们仅仅筛选出单一数据,仅做范例。
若是多个有关联的数据,可以利用正则匹配等方法处理数据,整理到一个字典中再打印出来或者保存到文件以及数据库等等。
由于笔者能力有限,所以对很多地方实在不敢妄加赘述,如有不足之处,望及时指出
在此简单总结一下本文:静态网页爬取步骤:
1.利用bs4和requests来获取网址的response以及解析网页
2.观察,寻找所需数据的位置,加以筛选
3.处理标签中文本,若数据大且有所关联则归整到字典
我们当然可以将一些基本操作封装成函数,以便操作:
def get_wb_data(url,label,headers=None):if(headers==None):response = requests.get(url)else:response=requests.get(url,headers=headers)soup=BeautifulSoup(response.text,'lxml')data=soup.select(label)return datadef print_data(data):for x in data:print(x.get_text())
所以,我们在针对一个或同一类网站若需要长期获取某一类信息,可以封装函数,可以更加便利。
想必看阅本文的都是希望接触python爬虫的初学者,在此建议:
多动手操作,去大胆爬取自己想要的信息,在这个过程中,会发现有许多东西爬不下来,这时,我们可以进一步去探索异步加载的处理,即如何应对动态网页的知识。
并且我们可能会遇到仅仅get是不足以获取数据的情况,那么就需要我们了解Headers,让爬虫去模仿人访问等知识。
再进一步,我们发现有的网站很多东西不断更新,专门进行反爬取,那么我们可能会接触破解验证码,如何避免封IP等问题。
…………(假装分界线)
笔者实在能力有限,对之后的种种还无法熟练操控,若笔者自认可以继续进一步讲解时,或许会有后续文章。
希望此文可以帮助一些初级入门的朋友,再次感谢。