文档章节

python 利用Beautifulsoup爬取笑话网站

宝茜滴老公
 宝茜滴老公
发布于 2017/09/09 17:02
字数 1659
阅读 596
收藏 29

利用Beautifulsoup爬取知名笑话网站

首先我们来看看需要爬取的网站:http://xiaohua.zol.com.cn/

1.开始前准备

1.1 python3,本篇博客内容采用python3来写,如果电脑上没有安装python3请先安装python3.

1.2 Request库,urllib的升级版本打包了全部功能并简化了使用方法。下载方法:

pip install requests

1.3 Beautifulsoup库, 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.。下载方法:

pip install beautifulsoup4

1.4 LXML,用于辅助Beautifulsoup库解析网页。(如果你不用anaconda,你会发现这个包在Windows下pip安装报错)下载方法:

pip install lxml

1.5 pycharm,一款功能强大的pythonIDE工具。下载官方版本后,使用license sever免费使用(同系列产品类似),具体参照http://www.cnblogs.com/hanggegege/p/6763329.html

2.爬取过程演示与分析

from bs4 import BeautifulSoup
import os
import requests

导入需要的库,os库用来后期储存爬取内容。

随后我们点开“最新笑话”,发现有“全部笑话”这一栏,能够让我们最大效率地爬取所有历史笑话!

我们来通过requests库来看看这个页面的源代码:

from bs4 import BeautifulSoup
import os
import requests
all_url = 'http://xiaohua.zol.com.cn/new/ 
headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
all_html=requests.get(all_url,headers = headers)
print(all_html.text)

header是请求头,大部分网站没有这个请求头会爬取失败

部分效果如下:

通过源码分析发现我们还是不能通过此网站就直接获取到所有笑话的信息,因此我们在在这个页面找一些间接的方法。

点开一个笑话查看全文,我们发现此时网址变成了http://xiaohua.zol.com.cn/detail58/57681.html,在点开其他的笑话,我们发现网址部都是形如http://xiaohua.zol.com.cn/detail?/?.html的格式,我们以这个为突破口,去爬取所有的内容

我们的目的是找到所有形如http://xiaohua.zol.com.cn/detail?/?.html的网址,再去爬取其内容。

我们在“全部笑话”页面随便翻到一页:http://xiaohua.zol.com.cn/new/5.html ,按下F12查看其源代码,按照其布局发现 :

每个笑话对应其中一个<li>标签,分析得每个笑话展开全文的网址藏在href当中,我们只需要获取href就能得到笑话的网址


from bs4 import BeautifulSoup
import os
import requests
all_url = 'http://xiaohua.zol.com.cn/new/ 

'
headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
all_html=requests.get(all_url,headers = headers)
#print(all_html.text)
soup1 = BeautifulSoup(all_html.text,'lxml')
list1=soup1.find_all('li',class_ = 'article-summary')
for i in list1:
    #print(i)
    soup2 = BeautifulSoup(i.prettify(),'lxml')
    list2=soup2.find_all('a',target = '_blank',class_='all-read')
    for b in list2:
        href = b['href']
        print(href)

我们通过以上代码,成功获得第一页所有笑话的网址后缀:

也就是说,我们只需要获得所有的循环遍历所有的页码,就能获得所有的笑话。

上面的代码优化后:

from bs4 import BeautifulSoup
import os
import requests
all_url = 'http://xiaohua.zol.com.cn/new/5.html 

'
def Gethref(url):
    headers = { 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
    html = requests.get(url,headers = headers)
    soup_first = BeautifulSoup(html.text,'lxml')
    list_first = soup_first.find_all('li',class_='article-summary')
    for i in list_first:
        soup_second = BeautifulSoup(i.prettify(),'lxml')
        list_second = soup_second.find_all('a',target = '_blank',class_='all-read')
        for b in list_second:
            href = b['href']
            print(href)
Gethref(all_url)

使用如下代码,获取完整的笑话地址url

​
from bs4 import BeautifulSoup
import os
import requests
all_url = 'http://xiaohua.zol.com.cn/new/5.html 

'
def Gethref(url):
    list_href = []
    headers = { 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
    html = requests.get(url,headers = headers)
    soup_first = BeautifulSoup(html.text,'lxml')
    list_first = soup_first.find_all('li',class_='article-summary')
    for i in list_first:
        soup_second = BeautifulSoup(i.prettify(),'lxml')
        list_second = soup_second.find_all('a',target = '_blank',class_='all-read')
        for b in list_second:
            href = b['href']
            list_href.append(href)
    return list_href
def GetTrueUrl(liebiao):
    for i in liebiao:
        url = 'http://xiaohua.zol.com.cn 

'+str(i)
        print(url)
GetTrueUrl(Gethref(all_url))

​

简单分析笑话页面html内容后,接下来获取一个页面全部笑话的内容:

from bs4 import BeautifulSoup
import os
import requests
all_url = 'http://xiaohua.zol.com.cn/new/5.html 

'
def Gethref(url):
    list_href = []
    headers = { 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
    html = requests.get(url,headers = headers)
    soup_first = BeautifulSoup(html.text,'lxml')
    list_first = soup_first.find_all('li',class_='article-summary')
    for i in list_first:
        soup_second = BeautifulSoup(i.prettify(),'lxml')
        list_second = soup_second.find_all('a',target = '_blank',class_='all-read')
        for b in list_second:
            href = b['href']
            list_href.append(href)
    return list_href
def GetTrueUrl(liebiao):
    list = []
    for i in liebiao:
        url = 'http://xiaohua.zol.com.cn 

'+str(i)
        list.append(url)
    return list
def GetText(url):
    for i in url:
        html = requests.get(i)
        soup = BeautifulSoup(html.text,'lxml')
        content = soup.find('div',class_='article-text')
        print(content.text)
GetText(GetTrueUrl(Gethref(all_url)))

效果图如下:

现在我们开始存储笑话内容!开始要用到os库了

使用如下代码,获取一页笑话的所有内容!

from bs4 import BeautifulSoup
import os
import requests
all_url = 'http://xiaohua.zol.com.cn/new/5.html 

'
os.mkdir('/home/lei/zol')
def Gethref(url):
    list_href = []
    headers = { 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
    html = requests.get(url,headers = headers)
    soup_first = BeautifulSoup(html.text,'lxml')
    list_first = soup_first.find_all('li',class_='article-summary')
    for i in list_first:
        soup_second = BeautifulSoup(i.prettify(),'lxml')
        list_second = soup_second.find_all('a',target = '_blank',class_='all-read')
        for b in list_second:
            href = b['href']
            list_href.append(href)
    return list_href
def GetTrueUrl(liebiao):
    list = []
    for i in liebiao:
        url = 'http://xiaohua.zol.com.cn 

'+str(i)
        list.append(url)
    return list
def GetText(url):
    for i in url:
        html = requests.get(i)
        soup = BeautifulSoup(html.text,'lxml')
        content = soup.find('div',class_='article-text')
        title = soup.find('h1',class_ = 'article-title')
        SaveText(title.text,content.text)
def SaveText(TextTitle,text):
    os.chdir('/home/lei/zol/')
    f = open(str(TextTitle)+'txt','w')
    f.write(text)
    f.close()
GetText(GetTrueUrl(Gethref(all_url)))

效果图:

(因为我的系统为linux系统,路径问题请按照自己电脑自己更改)

我们的目标不是抓取一个页面的笑话那么简单,下一步我们要做的是把需要的页面遍历一遍!

通过观察可以得到全部笑话页面url为http://xiaohua.zol.com.cn/new/+页码+html,接下来我们遍历前100页的所有笑话,全部下载下来!

接下来我们再次修改代码:

from bs4 import BeautifulSoup
import os
import requests
num = 1
url = 'http://xiaohua.zol.com.cn/new/ 

'+str(num)+'.html'
os.mkdir('/home/lei/zol')
def Gethref(url):
    list_href = []
    headers = { 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
    html = requests.get(url,headers = headers)
    soup_first = BeautifulSoup(html.text,'lxml')
    list_first = soup_first.find_all('li',class_='article-summary')
    for i in list_first:
        soup_second = BeautifulSoup(i.prettify(),'lxml')
        list_second = soup_second.find_all('a',target = '_blank',class_='all-read')
        for b in list_second:
            href = b['href']
            list_href.append(href)
    return list_href
def GetTrueUrl(liebiao):
    list = []
    for i in liebiao:
        url = 'http://xiaohua.zol.com.cn 

'+str(i)
        list.append(url)
    return list
def GetText(url):
    for i in url:
        html = requests.get(i)
        soup = BeautifulSoup(html.text,'lxml')
        content = soup.find('div',class_='article-text')
        title = soup.find('h1',class_ = 'article-title')

        SaveText(title.text,content.text)
def SaveText(TextTitle,text):
    os.chdir('/home/lei/zol/')
    f = open(str(TextTitle)+'txt','w')
    f.write(text)
    f.close()
while num<=100:
    url = 'http://xiaohua.zol.com.cn/new/ 

' + str(num) + '.html'
    GetText(GetTrueUrl(Gethref(url)))
    num=num+1

大功告成!剩下的等待文件下载完全就行拉!

效果图:

                                                                                                                                                               谢谢观看!

© 著作权归作者所有

共有 人打赏支持
宝茜滴老公
粉丝 6
博文 4
码字总数 3537
作品 0
南昌
程序员
加载中

评论(5)

sprouting
sprouting

引用来自“sprouting”的评论

运行报 :
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?

引用来自“宝茜滴老公”的评论

这个是因为你用的python没有安装lxml哦,pip install lxml就行了
已经安装了的,重新卸载后再次安装还是不行
宝茜滴老公
宝茜滴老公

引用来自“sprouting”的评论

运行报 :
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?
这个是因为你用的python没有安装lxml哦,pip install lxml就行了
sprouting
sprouting
运行报 :
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?
clouddyy
clouddyy
收藏
HingBox
HingBox
蛮好的,学习了
(转)Python中第三方模块的使用心得

前面已经说了,其实学习Python的过程,很多时候就是在学习如何使用第三方模块,完成自己需要的功能。 关于Python的第三方库类库,其实网上很多很多相关资料。 其中,官网的Python库:Python ...

Dyllian
2013/05/22
0
0
Python网络爬虫四大选择器(正则表达式、BS4、Xpath、CSS)总结

前几天小编连续写了四篇关于Python选择器的文章,分别用正则表达式、BeautifulSoup、Xpath、CSS选择器分别抓取京东网的商品信息。今天小编来给大家总结一下这四个选择器,让大家更加深刻的理...

dcpeng
09/02
0
0
ubuntu12.04 安装BeautifulSoup遇到的问题

root@ubuntu :/home/chris# apt-get install python-setuptools Reading package lists... Done Building dependency tree Reading state information... Done The following packages were ......

durban
2012/05/18
0
0
BeautifulSoup安装及其应用

BeautifulSoup 安装及其使用 BeautifulSoup 是个好东东。 官网见这里: http://www.crummy.com/software/BeautifulSoup/ 下载地址见这里:http://www.crummy.com/software/BeautifulSoup/bs......

Prefecter
2014/01/02
0
0
python BeautifulSoup模块的安装

python BeautifulSoup模块的安装 ···一个BeautifulSoup的模块,安装就浪费了俺这么长时间,下载的是BeautifulSoup4-4.1.3, 安装的时候就是 python setup.py build python setup.py inst...

昏鸦
2014/10/17
0
2

没有更多内容

加载失败,请刷新页面

加载更多

一个可能的NEO链上安全随机数解决方案

0x00 困境 链上安全随机数生成应该算是一个比较蛋疼的问题,哪怕你的系统再牛逼,合约程序困在小小的虚拟机里,哪怕天大的本事也施展不开。 更悲催的是,交易执行的时候,是在每一个节点都执...

暖冰
21分钟前
0
0
【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
1
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部