Python 爬虫 简单实例 爬取糗事百科段子

简单实例 爬取糗事百科段子

更多请查看:点击打开链接  点击打开链接

在命令行中浏览

浏览段子


首先,我们来看下糗事百科的首页:点击打开链接

再查看源码可以看到

我们想要的段子都是这样的:

<div class="content">

问:你买过最好的假货是什么?<br/>神回答:我曾经买过一本盗版书,竟然把正版书里的个别错别字给改了过来!

</div>

这说明只需要用 正则表达式 截取出来就行了

正则表达式:点击打开链接

再看网页的URL,该网页是分页的,所以可以直接枚举页数来访问

即:URL:http://www.qiushibaike.com/hot/page/页数

这样就可以用 Python 把网页下载下来了

但是没伪装头部 headers 还不行

所以要先查看当前网页的 User-Agent

这个在 F12 的 network 里可以看到

然后添加到 headers 里就行了

可见这篇文章:点击打开链接


当然,光访问还不够,还要显示,存储页面

这些在代码中可以看到

利用一个线程下载页面

主线程显示截取的段子

这样使得过程更加流畅,而不是每次显示又去等待下载截取网页


代码如下:


#coding: utf-8
#
#---- A simple spider-----
#---- Author: Idaplb -----
#-------------------------
#---- Enter is next page--
#---- q is quit ----------

import urllib.request
import re
import threading, time

class spider:

    def __init__(self):
        self.page = 1
        self.pages = []
        self.enable = False

    def get_page(self, page):
        url = "http://www.qiushibaike.com/hot/page/" + page + "/"
        user_agent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"
        headers = {"User-Agent": user_agent}
        request = urllib.request.Request(url, headers = headers)
        html_page = urllib.request.urlopen(request).read()
        html_page = html_page.decode("utf-8")
        re_item = re.findall("<div.*?class=\"content\">(.*?)</div>", html_page, re.S)
        items = []
        for item in re_item:
            item = item.replace("\n", "")
            item = item.replace("<br/>", "\n")
            items.append(item)
        return items
    
    def load_page(self):
        while self.enable:
            if len(self.pages) < 2:
                try:
                    page = self.get_page(str(self.page))
                    self.pages.append(page)
                    self.page += 1
                except urllib.request.URLError as e:
                    if hasattr(e, "code"):
                        print(e.code)
                    elif hasattr(e, "reason"):
                        print(e.reason)
            else:
                time.sleep(1)
        return

    def show_page(self, now_page, page):
        print("Show the %dth page" % (page))
        for item in now_page:
            print(item)
            flag = input()
            if flag == "q":
                self.enable = False
                break
        return

    def start(self):
        self.enable = True
        page = self.page
        print("Loading...")

        t = threading.Thread(target = self.load_page)
        t.start()

        while self.enable:
            if self.pages:
                now_page = self.pages[0]
                del self.pages[0]
                self.show_page(now_page, page)
                page += 1
        return

test_spider = spider()
test_spider.start()

其中按回车出一条段子,输入q 退出

整个过程走一遍并不复杂,只是很多地方要加以注意

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值