Python爬虫--抓取糗事百科段子

今天使用python爬虫实现了自动抓取糗事百科的段子,因为糗事百科不需要登录,抓取比较简单。程序每按一次回车输出一条段子,代码参考了 http://cuiqingcai.com/990.html 但该博主的代码似乎有些问题,我自己做了修改,运行成功,下面是代码内容:

 1 # -*- coding:utf-8 -*-
 2 __author__ = ‘Jz‘
 3 import urllib2
 4 import re
 5
 6 #糗事百科爬虫类
 7 class QSBK:
 8     #初始化
 9     def __init__(self):
10         self.pageIndex = 1
11         self.user_agent = ‘Mozilla/5.0 (Windows NT 6.1; WOW64)‘
12         self.headers = {‘User-Agent‘: self.user_agent}
13         #joke的每一个元素是每一页的段子
14         self.joke = []
15         #判断是否继续运行
16         self.enable = False
17
18     def getPage(self, pageIndex):
19         try:
20             URL = ‘http://www.qiushibaike.com/hot/page/‘ + str(pageIndex)
21             request = urllib2.Request(url = URL, headers = self.headers)
22             response = urllib2.urlopen(request)
23             pageContent = response.read().decode(‘utf-8‘)
24             return pageContent
25         except urllib2.URLError, e:
26             if hasattr(e, ‘reason‘):
27                 print ‘段子抓取失败,失败原因:‘, e.reason
28                 return None
29
30     def getJokeList(self, pageIndex):
31         pageContent = self.getPage(pageIndex)
32         if not pageContent:
33             print ‘段子获取失败...‘
34             return None
35         #第三个组中的内容用于判断段子是否附带图片
36         pattern = re.compile(r‘<div.*?class="author">.*?<a.*?>.*?<img.*?/>\n(.*?)\n</a>.*?</div>.*?<div class="content">\n\n(.*?)\n<!--.*?-->.*?</div>‘ +
37                          r‘(.*?)class="stats">.*?<span.*?class="stats-vote"><i.*?class="number">(.*?)</i>‘
38                          , re.S)
39         jokes = re.findall(pattern, pageContent)
40         pageJokes = []
41         #过滤带有图片的段子
42         for joke in jokes:
43             hasImg = re.search(‘img‘, joke[2])
44             #joke[0]为发布人,joke[1]为段子内容,joke[3]为点赞数量
45             if not hasImg:
46                 pageJokes.append([joke[0].strip(), joke[1].strip(), joke[3].strip()])
47         return pageJokes
48
49     def loadPage(self):
50         if self.enable == True:
51             #若当前已看的页数少于两页,则加载新的一页
52             if len(self.joke) < 2:
53                 pageJokes = self.getJokeList(self.pageIndex)
54                 if pageJokes:
55                     self.joke.append(pageJokes)
56                     self.pageIndex += 1
57
58     #每输入一次回车,打印一条段子
59     def getOneJoke(self, pageJokes, page):
60         jokes = pageJokes
61         for joke in jokes:
62             userInput = raw_input(‘请输入回车键或Q/q: ‘)
63             self.loadPage()
64             if userInput == ‘Q‘ or userInput == ‘q‘:
65                 self.enable = False
66                 print ‘退出爬虫...‘
67                 return
68             print u‘段子内容:%s\n第%d页\t发布人:%s\t赞:%s‘ % (joke[1], page, joke[0], joke[2])
69
70     def start(self):
71         print ‘正在从糗事百科抓取段子,按回车键查看新段子,按Q/q退出...‘
72         self.enable = True
73         self.loadPage()
74         page = 0
75         while self.enable:
76             if len(self.joke) > 0:
77                 pageJokes = self.joke[0]
78                 page += 1
79                 #删除已经读取过的段子页
80                 del self.joke[0]
81                 self.getOneJoke(pageJokes, page)
82
83 spider = QSBK()
84 spider.start()

注释已经附上,其中有几点需要注意的地方:

1.需要加上header验证进行伪装,否则无法抓取网页内容

2.正则表达式的书写,需要将内容提取出来以验证是否有附带图片(代码中已用红色标注)

3.getOneJoke函数中格式化输出段子时(已用红色标注),需要在字符串前加上u,否则会报如下错误:

Traceback (most recent call last):
  File "D:\coding_file\python_file\TestPython\src\Test\QSBK.py", line 84, in <module>
    spider.start()
  File "D:\coding_file\python_file\TestPython\src\Test\QSBK.py", line 81, in start
    self.getOneJoke(pageJokes, page)
  File "D:\coding_file\python_file\TestPython\src\Test\QSBK.py", line 68, in getOneJoke
    print ‘段子内容:%s\n第%d页\t发布人:%s\t赞:%s‘ % (joke[1], page, joke[0], joke[2])
UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe7 in position 3: ordinal not in range(128)

这是因为Python默认编码方式为Unicode,所以joke[0]等也是Unicode编码,为了格式化输出,前面的字符串也需要转换成Unicode编码

时间: 2024-08-09 06:27:07

Python爬虫--抓取糗事百科段子的相关文章

Python爬虫爬取糗事百科段子内容

参照网上的教程再做修改,抓取糗事百科段子(去除图片),详情见下面源码: #coding=utf-8#!/usr/bin/pythonimport urllibimport urllib2import reimport threadimport timeimport sys #定义要抓取的网页#url = 'http://www.qiushibaike.com/hot/'#读取要抓取的网页#globalcontent = urllib.urlopen(url).read()#抓取段子内容#new_

Python爬虫-爬取糗事百科段子

闲来无事,学学python爬虫. 在正式学爬虫前,简单学习了下HTML和CSS,了解了网页的基本结构后,更加快速入门. 1.获取糗事百科url http://www.qiushibaike.com/hot/page/2/    末尾2指第2页 2.先抓取HTML页面 import urllib import urllib2 import re page = 2 url = 'http://www.qiushibaike.com/hot/page/' + str(page) #对应第2页的url

Python 网络爬虫 - 抓取糗事百科的段子(最新版)

代码 # -*- coding: cp936 -*- __author__ = "christian chen" import urllib2 import re import threading import time class Tool: def pTitle(self): return re.compile('<title.*?>(.*?)</', re.S) def pContent(self): return re.compile('<div cla

Python 简单爬虫抓取糗事百科

# coding:utf-8 import timeimport randomimport urllib2from bs4 import BeautifulSoup #引入 beautifulsoup模块 #p = 1 #定义 页url = 'http://www.qiushibaike.com/text/page/'#定义header my_headers = [    'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 F

芝麻HTTP:Python爬虫实战之爬取糗事百科段子

首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的情况,是因为正则表达式没有匹配到的缘故. 现在,博主已经对程序进行了重新修改,代码亲测可用,包括截图和说明,之前一直在忙所以没有及时更新,望大家海涵! 更新时间:2015/8/2 糗事百科又又又又改版了,博主已经没心再去一次次匹配它了,如果大家遇到长时间运行不出结果也不报错的情况,请大家参考最新的评

HtmlAgilityPack抓取糗事百科內容

本文实例讲述了C#使用HtmlAgilityPack抓取糗事百科内容的方法.分享给大家供大家参考.具体实现方法如下: Console.WriteLine("*****************糗事百科24小时热门*******************"); Console.WriteLine("请输入页码,输入0退出"); string page = Console.ReadLine(); while (page!="0") { HtmlWeb h

Python爬虫(十七)_糗事百科案例

糗事百科实例 爬取糗事百科段子,假设页面的URL是: http://www.qiushibaike.com/8hr/page/1 要求: 使用requests获取页面信息,用XPath/re做数据提取 获取每个帖子里的用户头像连接.用户姓名.段子内容.点赞次数和评论次数 保存到json文件内 参考代码 #-*- coding:utf-8 -*- import requests from lxml import etree page = 1 url = 'http://www.qiushibaik

bs4抓取糗事百科

抓取糗事百科内容及评论,不包含图片信息.user-agent填入浏览器的即可.user-agent对应的value,360极速浏览器的话,可以在地址栏输入about:version,回车,用户代理后面的一长串就是需要填入''里面的内容.其他的可以自行百度 import urllib.request import re from urllib import request from bs4 import BeautifulSoup #1.获取网页源代码 def get_html(url): hea

python爬取糗事百科段子

初步爬取糗事百科第一页段子(发布人,发布内容,好笑数和评论数) 1 #-*-coding:utf-8-*- 2 import urllib 3 import urllib2 4 import re 5 page = 1 6 url ='http://www.qiushibaike.com/hot/page/'+str(page) #第一页URL 7 headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/