简单抓站的N种方式(一)-urllib与bs4

如果要搞个抓站语言排行榜的话,python肯定是榜首无疑。本文分享一下不使用框架也能高效快速爬取网页的学习心得,python3中可使用BeautifulSoup库HTMLParser正则表达式等等,通过这些方法可爬取到大部分网站,不过某些使用JS渲染的网页内容,就需要模拟浏览器来进行爬取了。

1、简单爬取网页内容的流程

简单抓站的N种方式(一)-urllib与bs4_第1张图片
爬取网页流程.png

为了获取得到的网页内容,需要先解析URL,python3可用的库有: urllib.requestrequests;然后需要从HTML文档中找到需要抓取的数据,可用库有 BeautifulSoup库HTMLParser,同时,可以使用 正则表达式匹配到需要的内容;如果爬取的内容有很多页,这时需要分析一下URL的构造特征,然后拼接或构造URL,再重复以上步骤抓取。如果是通过ajax返回数据,就要用抓包分析数据来源URL。

下面以一个例子实际操作一下,抓取糗事百科(http://www.qiushibaike.com的热门段子,包括作者和段子内容。

2、使用urllib和BeautifulSoup

由于这个网站直接使用python爬虫无法访问,所以需要构造一个User-Agent。为了直观,将这一块放在一个函数里面。为了体现每个模块的作用,我把模块引入到需要用到的函数中。

def getPage(url): '''url:目标网址URL return:HTML文档''' import urllib.request as urlreq headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'} req = urlreq.Request(url,headers=headers) html = urlreq.urlopen(req).read() return html
调用这个函数,传入上面的那个url,会得到整个网页的html文档。

下面使用BeautifulSoup库解析得到的HTML文档,分析源码得知,所有内容都放在div下,内容和作者也是在div中;同样将这段代码放在一个函数中。

def qiushi01(page): '''传入解析得到的html文档,输出段子在一个字典中,包括作者和段子内容''' from bs4 import BeautifulSoup soup = BeautifulSoup(page,"lxml") allCnt = soup.find_all('div',attrs={'class':'article block untagged mb15'}) #一页中所有段子 for cnt in allCnt: author = cnt.h2.text #作者 content = cnt.find('div',attrs={'class':'content'}).text #段子正文 yield {'author':author,'content':content}

调用的时候,两个函数合并起来即为:
print(list(qiushi01(getPage(url))))
结果为:

简单抓站的N种方式(一)-urllib与bs4_第2张图片
结果.png

这里只是输出到屏幕上,并且是放在字典里的;当然,也可以把抓取下来的数据直接存储在文本文件或者数据库中。
这是最简单的抓取网页的方法了,并且也没有遇到很多问题。

爬虫难免会遇到问题,这时就需要用到python的异常处理了,后面会深入探讨python的异常处理机制。

对于JS渲染的网页内容,可以使用selenium模拟浏览器,如果不想看到浏览器窗口,还可以使用PhantomJS;python还有专门用于构建爬虫的框架,如PySpiderscrapy
以上只是抓取了一页,如果是需要把所有段子都抓下来需要怎么办呢?对了,构造URL,将page作为变量传入,或者使用get,传入参数,然后循环一下就搞定。

好了,工头催我去松土了,等有时间再分享一下更加高级的爬虫吧。后续更新吧

你可能感兴趣的:(简单抓站的N种方式(一)-urllib与bs4)