文档章节

python 利用Beautifulsoup爬取笑话网站

宝茜滴老公
 宝茜滴老公
发布于 2017/09/09 17:02
字数 1659
阅读 585
收藏 29
点赞 3
评论 5

利用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
蛮好的,学习了
手把手教你写网络爬虫(1):网易云音乐歌单

原文出处:拓海 大家好,《手把手教你写网络爬虫》连载开始了!在笔者的职业生涯中,几乎没有发现像网络爬虫这样的编程实践,可以同时吸引程序员和门外汉的注意。本文由浅入深的把爬虫技术和...

拓海 ⋅ 04/27 ⋅ 0

实战(二)轻松使用requests库和beautifulsoup爬链接

前言 实战(一)之使用自带urllib和re正则表达式获取电影详情页链接 其实大多情况下,python自带的urllib和re正则表达式已经可以满足我们的日常需求了,但是,聪明的世人怎么会满足于此呢,只...

鱼头豆腐文 ⋅ 2017/12/03 ⋅ 0

Python开发简单爬虫--学习笔记

一、概述 目标 掌握开发轻量级爬虫 内容 爬虫简介 简单爬虫架构 URL管理器 网页下载器(urllib2) 网页解析器(BeautifulSoup) 完整实例:爬取百度百科雷军词条相关的1000个页面数据 tips: 轻量...

老男孩coder ⋅ 06/17 ⋅ 0

python3 scrapy 爬虫实战之爬取站长之家

爬取目标 站长之家:http://top.chinaz.com/all/ 爬取工具 win10 python3 scrapy BeautifulSoup 爬取内容 1 网站缩略图 2 网站名称 3 网址 4 Alexa排名,5 百度权重 6 网站简介 7 网站得分 ...

徐代龙 ⋅ 05/23 ⋅ 0

爬虫入门教程⑧— BeautifulSoup解析豆瓣即将上映的电影信息

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间. 这是...

皮卡丘丶 ⋅ 05/11 ⋅ 0

某校Python编程少年,曝光了所有美貌女生的信息,无可奈何

对于我们学习Python的人来说,想要获取到一些自己想要的信息,并没有什么难度。 比如说:哪位老师、同学的电话号码,同学们的考试结果(分数)等联系方式。我们获取到的这些信息,自己知道就...

qq_41841569 ⋅ 05/12 ⋅ 0

什么样的人学Python比别人快?Python的学习大纲有哪些?

什么样的人学Python比别人快? 为什么会是这些人?前两类大家应该都没什么意见,为什么最后两类会学得快?这两类说白了就一个关键词:转行!既然决定转行,有太多需要学习的东西,太多不适应...

帅帅程序员 ⋅ 04/28 ⋅ 0

[python应用案例] 一.BeautifulSoup爬取天气信息并发送至QQ邮箱

前面作者写了很多Python系列文章,包括: Python基础知识系列:Python基础知识学习与提升 Python网络爬虫系列:Python爬虫之Selenium+Phantomjs+CasperJS Python数据分析系列:知识图谱、web...

eastmount ⋅ 05/03 ⋅ 0

Python网络编程:初探nltk与美汤结合处理网络数据

前置要求 使用Python BeautifulSoup 包获得网页数据,需要用户电脑中安装了BeautifulSoup包。该包支持pip安装,可输入如下指令安装: 导入网页数据:urlopen(URL) Python网页数据的读写与I/O...

SamYjy ⋅ 05/11 ⋅ 0

关于BeautifulSoup解析html

有一个html AA 今天天气真好 python3下,用BeautifulSoup怎么能把id="content"里面的所有字符都获取到? 即这段内容: AA 今天天气真好

chelze ⋅ 05/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

C++内存映射文件居然是这样?!

内存映射文件大家都时不时听过,但它到底是个什么?赶紧来看看吧 内存映射文件到底是干嘛的呢?让我们先来思考下面几个问题: 如果您想读的内容大于系统分配的内存块怎么办?如果您想搜索的字...

柳猫 ⋅ 29分钟前 ⋅ 0

MySQL 数据库设计总结

规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过1000字节...

OSC_cnhwTY ⋅ 今天 ⋅ 0

多线程(四)

线程池和Exector框架 什么是线程池? 降低资源的消耗 提高响应速度,任务:T1创建线程时间,T2任务执行时间,T3线程销毁时间,线程池没有或者减少T1和T3 提高线程的可管理性。 线程池要做些什...

这很耳东先生 ⋅ 今天 ⋅ 0

使用SpringMVC的@Validated注解验证

1、SpringMVC验证@Validated的使用 第一步:编写国际化消息资源文件 编写国际化消息资源ValidatedMessage.properties文件主要是用来显示错误的消息定制 [java] view plain copy edit.userna...

瑟青豆 ⋅ 今天 ⋅ 0

19.压缩工具gzip bzip2 xz

6月22日任务 6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具 6.1 压缩打包介绍: linux中常见的一些压缩文件 .zip .gz .bz2 .xz .tar .gz .tar .bz2 .tar.xz 建立一些文...

王鑫linux ⋅ 今天 ⋅ 0

6. Shell 函数 和 定向输出

Shell 常用函数 简洁:目前没怎么在Shell 脚本中使用过函数,哈哈,不过,以后可能会用。就像java8的函数式编程,以后获取会用吧,行吧,那咱们简单的看一下具体的使用 Shell函数格式 linux ...

AHUSKY ⋅ 今天 ⋅ 0

单片机软件定时器

之前写了一个软件定时器,发现不够优化,和友好,现在重写了 soft_timer.h #ifndef _SOFT_TIMER_H_#define _SOFT_TIMER_H_#include "sys.h"typedef void (*timer_callback_function)(vo...

猎人嘻嘻哈哈的 ⋅ 今天 ⋅ 0

好的资料搜说引擎

鸠摩搜书 简介:鸠摩搜书是一个电子书搜索引擎。它汇集了多个网盘和电子书平台的资源,真所谓大而全。而且它还支持筛选txt,pdf,mobi,epub、azw3格式文件。还显示来自不同网站的资源。对了,...

乔三爷 ⋅ 今天 ⋅ 0

Debian下安装PostgreSQL的表分区插件pg_pathman

先安装基础的编译环境 apt-get install build-essential libssl1.0-dev libkrb5-dev 将pg的bin目录加入环境变量,主要是要使用 pg_config export PATH=$PATH:/usr/lib/postgresql/10/bin 进......

玛雅牛 ⋅ 今天 ⋅ 0

inno安装

#define MyAppName "HoldChipEngin" #define MyAppVersion "1.0" #define MyAppPublisher "Hold Chip, Inc." #define MyAppURL "http://www.holdchip.com/" #define MyAppExeName "HoldChipE......

backtrackx ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部