Python利用Beautifulsoup爬取笑话网站

利用Beautifulsoup爬取老牌笑话网站

创新互联建站服务项目包括罗城网站建设、罗城网站制作、罗城网页制作以及罗城网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,罗城网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到罗城省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

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

1.开始前准备

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

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

 
 
 
 
  1. pip install requests

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

 
 
 
 
  1. pip install beautifulsoup4

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

 
 
 
 
  1. pip install lxml

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

2.爬取过程演示与分析

 
 
 
 
  1. from bs4 import BeautifulSoup
  2. import os
  3. import requests 

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

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

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

 
 
 
 
  1. from bs4 import BeautifulSoup
  2. import os
  3. import requests
  4. all_url = 'http://xiaohua.zol.com.cn/new/
  5. 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"}
  6. all_html=requests.get(all_url,headers = headers)
  7. 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查看其源代码,按照其布局发现 :

每个笑话对应其中一个

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

     
     
     
     
    1. from bs4 import BeautifulSoup
    2. import os
    3. import requests
    4. all_url = 'http://xiaohua.zol.com.cn/new/ 
    5. '
    6. 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"}
    7. all_html=requests.get(all_url,headers = headers)
    8. #print(all_html.text)
    9. soup1 = BeautifulSoup(all_html.text,'lxml')
    10. list1=soup1.find_all('li',class_ = 'article-summary')
    11. for i in list1:
    12.     #print(i)
    13.     soup2 = BeautifulSoup(i.prettify(),'lxml')
    14.     list2=soup2.find_all('a',target = '_blank',class_='all-read')
    15.     for b in list2:
    16.         href = b['href']
    17.         print(href) 

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

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

    上面的代码优化后:

     
     
     
     
    1. from bs4 import BeautifulSoup
    2. import os
    3. import requests
    4. all_url = 'http://xiaohua.zol.com.cn/new/5.html 
    5. '
    6. def Gethref(url):
    7.     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"}
    8.     html = requests.get(url,headers = headers)
    9.     soup_first = BeautifulSoup(html.text,'lxml')
    10.     list_first = soup_first.find_all('li',class_='article-summary')
    11.     for i in list_first:
    12.         soup_second = BeautifulSoup(i.prettify(),'lxml')
    13.         list_second = soup_second.find_all('a',target = '_blank',class_='all-read')
    14.         for b in list_second:
    15.             href = b['href']
    16.             print(href)
    17. Gethref(all_url) 

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

     
     
     
     
    1. from bs4 import BeautifulSoup
    2. import os
    3. import requests
    4. all_url = 'http://xiaohua.zol.com.cn/new/5.html 
    5. '
    6. def Gethref(url):
    7.     list_href = []
    8.     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"}
    9.     html = requests.get(url,headers = headers)
    10.     soup_first = BeautifulSoup(html.text,'lxml')
    11.     list_first = soup_first.find_all('li',class_='article-summary')
    12.     for i in list_first:
    13.         soup_second = BeautifulSoup(i.prettify(),'lxml')
    14.         list_second = soup_second.find_all('a',target = '_blank',class_='all-read')
    15.         for b in list_second:
    16.             href = b['href']
    17.             list_href.append(href)
    18.     return list_href
    19. def GetTrueUrl(liebiao):
    20.     for i in liebiao:
    21.         url = 'http://xiaohua.zol.com.cn 
    22. '+str(i)
    23.         print(url)
    24. GetTrueUrl(Gethref(all_url))

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

     
     
     
     
    1. from bs4 import BeautifulSoup
    2. import os
    3. import requests
    4. all_url = 'http://xiaohua.zol.com.cn/new/5.html 
    5. '
    6. def Gethref(url):
    7.     list_href = []
    8.     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"}
    9.     html = requests.get(url,headers = headers)
    10.     soup_first = BeautifulSoup(html.text,'lxml')
    11.     list_first = soup_first.find_all('li',class_='article-summary')
    12.     for i in list_first:
    13.         soup_second = BeautifulSoup(i.prettify(),'lxml')
    14.         list_second = soup_second.find_all('a',target = '_blank',class_='all-read')
    15.         for b in list_second:
    16.             href = b['href']
    17.             list_href.append(href)
    18.     return list_href
    19. def GetTrueUrl(liebiao):
    20.     list = []
    21.     for i in liebiao:
    22.         url = 'http://xiaohua.zol.com.cn 
    23. '+str(i)
    24.         list.append(url)
    25.     return list
    26. def GetText(url):
    27.     for i in url:
    28.         html = requests.get(i)
    29.         soup = BeautifulSoup(html.text,'lxml')
    30.         content = soup.find('div',class_='article-text')
    31.         print(content.text)
    32. GetText(GetTrueUrl(Gethref(all_url))) 

    效果图如下:

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

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

     
     
     
     
    1. from bs4 import BeautifulSoup
    2. import os
    3. import requests
    4. all_url = 'http://xiaohua.zol.com.cn/new/5.html 
    5. '
    6. os.mkdir('/home/lei/zol')
    7. def Gethref(url):
    8.     list_href = []
    9.     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"}
    10.     html = requests.get(url,headers = headers)
    11.     soup_first = BeautifulSoup(html.text,'lxml')
    12.     list_first = soup_first.find_all('li',class_='article-summary')
    13.     for i in list_first:
    14.         soup_second = BeautifulSoup(i.prettify(),'lxml')
    15.         list_second = soup_second.find_all('a',target = '_blank',class_='all-read')
    16.         for b in list_second:
    17.             href = b['href']
    18.             list_href.append(href)
    19.     return list_href
    20. def GetTrueUrl(liebiao):
    21.     list = []
    22.     for i in liebiao:
    23.         url = 'http://xiaohua.zol.com.cn 
    24. '+str(i)
    25.         list.append(url)
    26.     return list
    27. def GetText(url):
    28.     for i in url:
    29.         html = requests.get(i)
    30.         soup = BeautifulSoup(html.text,'lxml')
    31.         content = soup.find('div',class_='article-text')
    32.         title = soup.find('h1',class_ = 'article-title')
    33.         SaveText(title.text,content.text)
    34. def SaveText(TextTitle,text):
    35.     os.chdir('/home/lei/zol/')
    36.     f = open(str(TextTitle)+'txt','w')
    37.     f.write(text)
    38.     f.close()
    39. GetText(GetTrueUrl(Gethref(all_url))) 

    效果图:

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

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

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

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

     
     
     
     
    1. from bs4 import BeautifulSoup
    2. import os
    3. import requests
    4. num = 1
    5. url = 'http://xiaohua.zol.com.cn/new/ 
    6. '+str(num)+'.html'
    7. os.mkdir('/home/lei/zol')
    8. def Gethref(url):
    9.     list_href = []
    10.     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"}
    11.     html = requests.get(url,headers = headers)
    12.     soup_first = BeautifulSoup(html.text,'lxml')
    13.     list_first = soup_first.find_all('li',class_='article-summary')
    14.     for i in list_first:
    15.         soup_second = BeautifulSoup(i.prettify(),'lxml')
    16.         list_second = soup_second.find_all('a',target = '_blank',class_='all-read')
    17.         for b in list_second:
    18.             href = b['href']
    19.             list_href.append(href)
    20.     return list_href
    21. def GetTrueUrl(liebiao):
    22.     list = []
    23.     for i in liebiao:
    24.         url = 'http://xiaohua.zol.com.cn 
    25. '+str(i)
    26.         list.append(url)
    27.     return list
    28. def GetText(url):
    29.     for i in url:
    30.         html = requests.get(i)
    31.         soup = BeautifulSoup(html.text,'lxml')
    32.         content = soup.find('div',class_='article-text')
    33.         title = soup.find('h1',class_ = 'article-title')
    34.         SaveText(title.text,content.text)
    35. def SaveText(TextTitle,text):
    36.     os.chdir('/home/lei/zol/')
    37.     f = open(str(TextTitle)+'txt','w')
    38.     f.write(text)
    39.     f.close()
    40. while num<=100:
    41.     url = 'http://xiaohua.zol.com.cn/new/ 
    42. ' + str(num) + '.html'
    43.     GetText(GetTrueUrl(Gethref(url)))
    44.     num=num+1 

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

    效果图:

    名称栏目:Python利用Beautifulsoup爬取笑话网站
    浏览路径:http://www.shufengxianlan.com/qtweb/news38/147588.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联