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

来源:互联网 发布:七乐彩胆拖兑奖算法 编辑:程序博客网 时间:2024/06/04 18:05

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

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

在命令行中浏览

浏览段子


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

再查看源码可以看到

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

<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.requestimport reimport threading, timeclass 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        returntest_spider = spider()test_spider.start()

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

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

0 0