【Python爬虫案例】requests爬取冷笑话合集

1. 开发环境

  • Windows 10 企业版
  • Pycharm 2019.01 EAP Community Edition
  • Python 3.7

2. 前言

在学习python爬虫的时候,很多课程都会提到去爬取一些常规的网站进行练习。最近正好看到有个微信公众号的文章分享,我也试着做一期偏向教程的案例分享。
首先,python爬取网站的过程实际上是模拟了人浏览网页的过程,通过自动化的方法来完成操作。
然后,最轻松的爬虫即是把网页上的文字直接保存下来,不需要做过多的分析和查找过程。
因此,我们就选择爬取冷笑话的网站,通过爬取这样一个“简单”的网站理解爬虫的知识。

3.安装的库

requests python自带的库。
re python自带的库
BeautfulSoup 网页解析的库。

4.过程解析

4.1网站解析

首先进入笑话大全的网站:origin_url = 'http://xiaohua.zol.com.cn/lengxiaohua/'

笑话大全

选择笑话大全主网站上的“冷笑话”进入如下页面中。

冷笑话网页

从图中可以看出,每一个笑话不是完整的。必须点击“查看原文”才能浏览。因此这就确定了我们爬取冷笑话的思路。
在冷笑话页面找到所有的“查看全文”的超链接;再根据超链接进入详细页面中,下载每一个冷笑话。

4.2初步尝试解析网页

import requests
origin_url = 'http://xiaohua.zol.com.cn/lengxiaohua/' #冷笑话
response = requests.get(origin_url)
print(response.text)

为了防止被反爬虫,模拟浏览器访问网站,因此要将requests的参数中加入header。这段文字可以反复使用,也可以根据实际情况进行调整。

关于如何引入header可以看参考文献

import requests
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)\
 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'}
response = requests.get(origin_url, headers=head)  # 从链接中获取到回复信息
print(response.text)

4.3解析一级网站信息

再冷笑话网页右键查看源代码可以分析网页。在箭头所指的位置找到查看全文。

查看源代码

从源代码中可以看出<a target="_blank" href="/detail60/59364.html" class="all-read">查看全文&raquo;</a>是需要提取的信息。

通过 上文中已经获得网页返回的信息response
那么接下来通过BeautifulSoup对网页返回的信息进行解析。

from bs4 import BeautifulSoup
bsobj = BeautifulSoup(response.text, 'lxml')    #利用bs解析

在获得bsobj的基础上,bsobj.find_all('a')可以找到所有的<a>标签。但是我们需要进一步限定标签的范围,仅需要有“查找全文”关键字的标签即可,因此需要添加关键字查找。利用正则表达式查找字符串:bsobj.find_all('a',string = re.compile('查看全文'))

link = a_tag.get('href')获取到所有<a>标签中的链接地址,并存放到一个列表中。

import re
link_list = []
for a_tag in bsobj.find_all('a', string = re.compile('查看全文')):
    link = a_tag.get('href')
    if link:
        link_list.append(link)

4.4解析二级网站信息

由于对二级网站进行访问类似于以上所作的工作,因此将网页访问的部分改写为get_url_msg(origin_url)的函数

def get_url_msg(origin_url):
    head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)\
 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'}
    response = requests.get(origin_url, headers=head)  # 从链接中获取到回复信息
    bsobj = BeautifulSoup(response.text, 'lxml')    #利用bs解析
    return bsobj

接下来首先将二级网站的链接进行重新编写,将主域名加上网站网址就获得了要爬取的网站信息。

该部分最困难的地方是找到所有的冷笑话文字并提取出来。
首先按照上面相同的办法定位文字部分:bsobj.find_all(name="div", attrs={"class" :"article-text"}),这是根据网页的源代码进行分析出来的,找到html的类为"article-text"

然后需要将获得网页信息进行清洗,去除掉其中的所有空格,回车符号及<class> <p>等标签。使用article_text.get_text()获取到网页信息的所有文字。

再利用字符串操作,尽可能减少其中的其他符号。

origin_url = origin_url.split('/')

words_list = []
for link in link_list:
    article_link = origin_url[0]+"//"+origin_url[2]+link
    bsobj = get_url_msg(article_link)

    for article_text in bsobj.find_all(name="div", attrs={"class" :"article-text"}):
        article = article_text.get_text()
        article = article.replace(" ","")
        #article = article.split()
        re.sub("[\n]+","",article)
        #print(article)
        words_list.append(article)

4.5写入冷笑话信息

写入txt文档比较简单,这里要注意的是编码。
file.write(msg.encode("utf-8")要采用UTF-8编码。

# 创建一个txt文件,文件名为mytxtfile,并向文件写入msg
def text_create(name, msg):
    desktop_path = ""  # 新创建的txt文件的存放路径
    full_path = desktop_path + name + '.txt'  # 也可以创建一个.doc的word文档
    file = open(full_path, "wb+")
    file.write(msg.encode("utf-8"))  # msg也就是下面的msg!
    file.close()


text_create('mytxtfile', "\n".join(words_list))
# 调用函数创建一个名为mytxtfile的.txt文件,并向其写入msg

5.源代码分享

# encoding: utf-8
"""
@version: 1.0
@author: Jarrett
@file: run.py
@time: 2020/3/18 22:12
"""

import requests
from bs4 import BeautifulSoup
import re

origin_url = 'http://xiaohua.zol.com.cn/lengxiaohua/' #冷笑话

def get_url_msg(origin_url):
    head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)\
 Chrome/77.0.3865.120 Safari/537.36'}
    response = requests.get(origin_url, headers=head)  # 从链接中获取到回复信息
    bsobj = BeautifulSoup(response.text, 'lxml')    #利用bs解析
    return bsobj

bsobj = get_url_msg(origin_url)
link_list = []
for a_tag in bsobj.find_all('a', string = re.compile('查看全文')):
    link = a_tag.get('href')
    if link:
        link_list.append(link)

origin_url = origin_url.split('/')

words_list = []
for link in link_list:
    article_link = origin_url[0]+"//"+origin_url[2]+link
    bsobj = get_url_msg(article_link)

    for article_text in bsobj.find_all(name="div", attrs={"class" :"article-text"}):
        article = article_text.get_text()
        article = article.replace(" ","")
        #article = article.split()
        re.sub("[\n]+","",article)
        #print(article)
        words_list.append(article)


# 创建一个txt文件,文件名为mytxtfile,并向文件写入msg
def text_create(name, msg):
    desktop_path = ""  # 新创建的txt文件的存放路径
    full_path = desktop_path + name + '.txt'  # 也可以创建一个.doc的word文档
    file = open(full_path, "wb+")
    file.write(msg.encode("utf-8"))  # msg也就是下面的msg!
    file.close()


text_create('mytxtfile', "\n".join(words_list))
# 调用函数创建一个名为mytxtfile的.txt文件,并向其写入msg

6.总结

1.利用Requests和BeautifulSoup可以轻松完成网页信息的爬取工作。
2.可以尝试爬取笑话大全网站上的其他信息,如图片和视频等。
3.接下来将把爬取下来的文字进行分词操作,做词云展示。
4.合作咨询事宜请私信。【微店】【樱桃智库】提供爬虫服务。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容