开发者社区> 代码打碟手> 正文

Urllib2库+正则爬取内涵段子

简介:     内涵段子前段时间发生的事情,想必大家都有所耳闻,我本人也是非常喜欢看段子的。但这并不能阻止我想看段子的脚步,幸好,给大家推荐一个网站,叫做内涵吧,里面也有非常丰富的段子内容。
+关注继续查看

    内涵段子前段时间发生的事情,想必大家都有所耳闻,我本人也是非常喜欢看段子的。但这并不能阻止我想看段子的脚步,幸好,给大家推荐一个网站,叫做内涵吧,里面也有非常丰富的段子内容。下面就以内涵吧为例爬取所有段子,可供离线观看。

先分析请求的url地址

     第一页段子url:https://www.neihan8.com/wenzi/index.html

     第二页段子url:https://www.neihan8.com/wenzi/index.html

     第3页段子url:https://www.neihan8.com/wenzi/index.html

     那么就可以得出一个规律,也就是第n页段子url:https://www.neihan8.com/wenzi/index.html

     如果要设计一个较为人性化的使用方式,可以让用户自己设定爬取页码的开始和结束,部分代码如下所示:

start_page = int(raw_input("请输入您要下载的起始页:"))
end_page = int(raw_input("请输入您要下载的结束页:"))

for page in range(start_page, end_page+1):
     if page == 1:
         url = "https://www.neihan8.com/wenzi/index.html"
     else:
         url = "https://www.neihan8.com/wenzi/index_" + str(page) + ".html"

整理逻辑功能

    通过第一步已经拿到了每页的url,而每页内容都是一个段子列表,每页至少20个段子,这些列表包含段子的标题和每个段子的url,所以要提取出来,然后逐个读取。再将读取的内容与标题拼接成字符串,通过文件的读写功能写入每一个文件中

    下载每页所有的段子

def loadPage(self, page, url):
     """
         作用:下载该页所有的段子
         page:当前下载的页码
         url:当前页的url地址
     """
     print "*"*50
     print "正在下载第%s页"%page
     request = urllib2.Request(url, headers=self.headers)
     response = urllib2.urlopen(request)
     html = response.read()
     # print html
     return html
    提取出url和标题
def dealPage(self, page, html):
     """
         作用:处理当前页面的段子
         page:当前处理的页码
         html:当前页面的html内容
     """
     print "*"*50
     print "正在处理第%s页"%page
     pattern = re.compile(r'<h3><a\shref="(.*?)"\s.*?>(.*?)</a></h3>', re.S)
     urls_names = pattern.findall(html)
     duanzi_dict = self.dealEach(urls_names)
     return duanzi_dict

    使用正则解析每个段子的url

def dealPage(self, page, html):
     """
         作用:处理当前页面的段子
         page:当前处理的页码
         html:当前页面的html内容
     """
     print "*"*50
     print "正在处理第%s页"%page
     pattern = re.compile(r'<h3><a\shref="(.*?)"\s.*?>(.*?)</a></h3>', re.S)
     urls_names = pattern.findall(html)
     duanzi_dict = self.dealEach(urls_names)
     return duanzi_dict

    将段子拼接并写入文件

def writePage(self, page, duanzi_dict):
     """
         作用:写入该页所有的段子
         duanzi_dict:该页所有的段子标题与内容
     """
     print "*"*50
     print "正在写入第%s页"%page
     print "*"*50
     num = 1
     with open("第%s页"%page, "w") as f:
         for duanzi_name in duanzi_dict:
             print "正在记录第%s个段子"%num
             f.write(duanzi_name + '\n' + duanzi_dict[duanzi_name]+ '\n' + '\n' + '\n')
             num += 1

全部代码

#!/usr/bin/env python
# coding=utf-8

import urllib2
import re

class Spider(object):
    def __init__(self):
        self.headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36"}
    
    def loadPage(self, page, url):
        """
            作用:下载该页所有的段子
            page:当前下载的页码
            url:当前页的url地址
        """
        print "*"*50
        print "正在下载第%s页"%page
        request = urllib2.Request(url, headers=self.headers)
        response = urllib2.urlopen(request)
        html = response.read()
        # print html
        return html
        
    def dealPage(self, page, html):
        """
            作用:处理当前页面的段子
            page:当前处理的页码
            html:当前页面的html内容
        """
        print "*"*50
        print "正在处理第%s页"%page
        pattern = re.compile(r'<h3><a\shref="(.*?)"\s.*?>(.*?)</a></h3>', re.S)
        urls_names = pattern.findall(html)
        duanzi_dict = self.dealEach(urls_names)
        return duanzi_dict

    def dealEach(self, urls_names):
        """
            作用:处理每个段子的内容
            urls_names:每个段子的url和标题
        """
        duanzi_names = []
        duanzi_contents = []
        duanzi_content = ''
        for url,name in urls_names:
            duanzi_url = "https://www.neihan8.com" + url
            # print duanzi_url
            request = urllib2.Request(duanzi_url, headers=self.headers)
            response = urllib2.urlopen(request)
            html = response.read()
            # print html
            pattern = re.compile(r'<p>(.*?)</p>')
            duanzi_content = ''.join(pattern.findall(html)).replace("&ldquo;","").replace("&rdquo;","").replace("&hellip;","").replace("&quot;","").replace("&hellip;","").replace("&nbsp;","").replace("&mdash;","")
            # print duanzi_content
            duanzi_contents.append(duanzi_content)
            duanzi_names.append(name)

        duanzi_dict = dict(zip(duanzi_names, duanzi_contents))
        return duanzi_dict


    def writePage(self, page, duanzi_dict):
        """
            作用:写入该页所有的段子
            duanzi_dict:该页所有的段子标题与内容
        """
        print "*"*50
        print "正在写入第%s页"%page
        print "*"*50
        num = 1
        with open("第%s页.txt"%page, "w") as f:
            for duanzi_name in duanzi_dict:
                print "正在记录第%s个段子"%num
                f.write(duanzi_name + '\n' + duanzi_dict[duanzi_name]+ '\n' + '\n' + '\n')
                num += 1
            

    def neihan(self):
        list_urls = []
        start_page = int(raw_input("请输入您要下载的起始页:"))
        end_page = int(raw_input("请输入您要下载的结束页:"))
        if start_page <=0 or end_page <=0:
            print "当前输入不合法"
            return     
        
        for page in range(start_page, end_page+1):
            if page == 1:
                url = "https://www.neihan8.com/wenzi/index.html"
            else:
                url = "https://www.neihan8.com/wenzi/index_" + str(page) + ".html"
            # print url
            
            html = self.loadPage(page, url)
            duanzi_dict = self.dealPage(page, html)
            self.writePage(page, duanzi_dict)
            

if __name__ == "__main__":
    neihan_Spider = Spider()
    neihan_Spider.neihan()

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python网络爬虫之urllib2的使用细节与抓站技巧
某些网站反感爬虫的到访,于是对爬虫一律拒绝请求,这时候我们需要伪装成浏览器,这可以通过修改http包中的header来实现 一、伪装成浏览器访问+表单data的处理 示例1 二、获取访问Cookie的值 示例2 三、Proxy的设置及Timeout 设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy。
815 0
教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
来源:http://www.cnblogs.com/wanghzh/p/5824181.html 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力。本文以校花网为例进行爬取,校花网:http://www.xiaohuar.com/,让你体验爬取校花的成就感。   Scrapy,Python开发的一个快速,高层次的
2119 0
10分钟用Python爬取最近很火的复联4影评
10分钟用Python爬取最近很火的复联4影评
51 0
python爬虫爬取天气正则表达式解析案例
python爬虫爬取天气正则表达式解析案例
98 0
Python爬虫之40行代码爬取金庸所有武侠小说
  我们今天来用Python爬虫爬取金庸所有的武侠小说,网址为:http://jinyong.zuopinj.com/,网页如下:   Python代码如下: # -*- coding: utf-8 -*- import urllib.
2109 0
python各类爬虫案例,爬到你手软!
小编整理了一些爬虫的案例,代码都整理出来了~ 先来看看有哪些项目呢: python爬虫小工具(文件下载助手) 爬虫实战(笔趣看小说下载) 爬虫实战(VIP视频下载) 爬虫实战(百度文库文章下载) 爬虫实战(《帅啊》网帅哥图片下载) 爬虫实战(构建代理IP池) 爬虫实战(《火影忍者》漫画下载)...
5935 0
Requests库+正则爬取猫眼电影Top100
声明:此篇文章主要是观看静觅教学视频后做的笔记,原教程地址:https://cuiqingcai.com/ 流程框架 1.抓取单页内容:利用requests请求目标站点,得到单个网页HTML代码,返回结果。
1203 0
爬虫基础-第六天
在pycharm写正则,并学习re模块
20 0
+关注
代码打碟手
常用编程语言Python,熟悉主流的MySQL数据库,掌握MongoDB,Redis等非关系型数据库,在前端方面,熟悉HTML和CSS以及HTML5和CSS3的新特性,掌握JavaScript以及Jquery,Bootstrap等前端框架
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Python第五讲——关于爬虫如何做js逆向的思路
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载