国庆几天在家看了几篇关于使用Python来编写网络爬虫的博客,想来自己断断续续学习Python也有几个月了,但一个像样的程序都没有写过,编程能力并没有得到提高,愧对自己花费的时间。很多时候虽然知道什么事情是对的,但自身过于懒惰,不能坚持做一件事并且把它做好。这大概就是我和那些优秀的人之间的差距,这个月争取多写一些代码,把这个系列写完整!

下面的链接是假期在家看的一系列博客,收获很大!

编写小百合十大爬虫,需要作如下几步:

1.访问十大网页,获取十大信息;

2. 爬取十大各帖内容。


1.访问十大,获取十大信息

浏览器访问网页过程是:浏览器向服务器发送HTTP请求,服务器端收到HTTP请求后将客户请求的内容发送给浏览器,浏览器接收到服务器响应内容后将其进行显示供用户浏览。

使用Python来访问十大网页,这就要求我们要模拟浏览器的操作过程,向服务器端发送HTTP请求。Python的urllib2模块提供了这样的功能,urllib2.urlopen(url)函数能够打开多种类型的url链接,如http://www.baidu.com, ftp://cs.nju.edu.cn等等。

为了伪装成浏览器,我们需要在请求中添加User-Agent,表明自己是浏览器:)

如不添加,urllib2会将自己设定为Python-urllib/x.y(这里的x、y分别表示Python的主版本号和次版本号)

 def get_top10article(self):
top10_url = 'http://bbs.nju.edu.cn/bbstop10'
bbs_url = 'http://bbs.nju.edu.cn/' req = urllib2.Request(top10_url, headers = self.headers)
response = urllib2.urlopen(req)
top10_page = response.read()
#print top10_page #unicode_top10_page = top10_page.decode('utf-8')
pattern_str = '<tr.*?bgcolor=.*?><td>(.*?)<td><a.*?href=(.*?)>(.*?)</a><td><a.*?href="(.*?)">(.*?)\n</a><td><a.*?href=(.*?)>(.*?)</a><td>(.*?)\n'
pattern = re.compile(pattern_str)
#pattern = re.compile(r'<tr.*?bgcolor=.*?><td>(.*?)<td><a.*?href=(.*?)>(.*?)</a><td><a.*?href="(.*?)">(.*?)</a><td><a.*?href=(.*?)>(.*?)</a>')
top10_retrive_infos = pattern.findall(top10_page)
for info in top10_retrive_infos:
article = Article(info[0], bbs_url + info[1], info[2], bbs_url + info[3], info[4], bbs_url + info[5], info[6])
self.top10.append(article)
#print info

上面代码5-7行,向小百合发送HTTP请求,请求得到响应之后。在第11-17行使用正则表达式来捕获各个帖子的相关信息并保存在top10这样一个list中(line 17)。

2.爬取十大各帖内容

根据步骤1中获取的各帖子的信息,爬取所有回复帖子的内容,同样使用正则表达式提取各帖的主要内容,去除不必要的HTML标签。

 def get_article(self, url):
# url + '&start=-1' 显示本主题全部帖子
all_article_url = url + '&start=-1'
req = urllib2.Request(all_article_url, headers = self.headers)
response = urllib2.urlopen(req)
article_content = response.read() # use regular experssion to find out all the reply article content
pattern_str = '<textarea.*?id=.*?class=hide>(.*?)--\n.*?</textarea>'
pattern = re.compile(pattern_str, re.S)
all_replies_content = pattern.findall(article_content) f = open('all_replies_content.txt', 'w') result_content = []
for reply in all_replies_content:
f.write(reply)
result_content.append(reply)
#print reply
return result_content

3-6行获取了本主题全部帖子,9-11行使用正则表达式提取各帖的回复内容。

完整代码如下所示:

 # -*- coding: cp936 -*-
import urllib2
import urllib
import re
# 自定义帖子类,包括十大排名、板块链接、板块名、帖子链接、帖子标题、作者链接和作者 7个字段
class Article:
def __init__(self, rank, board_link, board, article_link, title, author_link, author):
self.rank = rank
self.board_link = board_link
self.board = board
self.article_link = article_link
self.title = title
self.author_link = author_link
self.author = author class Lily_Top10_Spider:
def __init__(self):
self.top10 = []
self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
self.headers = {'User-Agent' : self.user_agent} # 获取十大信息,添加到列表中并返回列表
def get_top10article(self):
top10_url = 'http://bbs.nju.edu.cn/bbstop10'
bbs_url = 'http://bbs.nju.edu.cn/' req = urllib2.Request(top10_url, headers = self.headers)
response = urllib2.urlopen(req)
top10_page = response.read()
#print top10_page #unicode_top10_page = top10_page.decode('utf-8')
pattern_str = '<tr.*?bgcolor=.*?><td>(.*?)<td><a.*?href=(.*?)>(.*?)</a><td><a.*?href="(.*?)">(.*?)\n</a><td><a.*?href=(.*?)>(.*?)</a><td>(.*?)\n'
pattern = re.compile(pattern_str)
#pattern = re.compile(r'<tr.*?bgcolor=.*?><td>(.*?)<td><a.*?href=(.*?)>(.*?)</a><td><a.*?href="(.*?)">(.*?)</a><td><a.*?href=(.*?)>(.*?)</a>')
top10_retrive_infos = pattern.findall(top10_page)
for info in top10_retrive_infos:
article = Article(info[0], bbs_url + info[1], info[2], bbs_url + info[3], info[4], bbs_url + info[5], info[6])
self.top10.append(article)
#print info for a in self.top10:
print a.title, ' ', a.author, ' ', a.board, ' ', a.article_link def get_article(self, url):
# url + '&start=-1' 显示本主题全部帖子
all_article_url = url + '&start=-1'
req = urllib2.Request(all_article_url, headers = self.headers)
response = urllib2.urlopen(req)
article_content = response.read()
#print article_content # use regular experssion to find out all the reply article content
pattern_str = '<textarea.*?id=.*?class=hide>(.*?)--\n.*?</textarea>'
pattern = re.compile(pattern_str, re.S)
all_replies_content = pattern.findall(article_content) f = open('all_replies_content.txt', 'w')
#print all_replies result_content = []
for reply in all_replies_content:
f.write(reply)
result_content.append(reply)
#print reply
return result_content
#return self.top10 ls = Lily_Top10_Spider()
ls.get_top10article() print '#1 article content:'
article_content = ls.get_article(ls.top10[9].article_link)
for s in article_content:
print s
print 'print end.'

现有的比较好的Python爬虫框架--Scrapy

官方网站:http://scrapy.org/
GitHub:https://github.com/scrapy/scrapy

[Python]小百合十大爬虫的更多相关文章

  1. 【python小练】图片爬虫之BeautifulSoup4

    Python3用不了Scrapy! Python3用不了Scrapy! Python3用不了Scrapy! [重要的事情说三遍,据说大神们还在尝试把scrapy移植到python3,特么浪费我半个小时 ...

  2. python小练习:使用循环和函数实现一个摇骰子小游戏。游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11<=总值<=18为“大”,3<=总值<=10为“小”。然后告诉玩家猜对或者是猜错的结果。

    python小练习:使用循环和函数实现一个摇骰子小游戏.游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11<=总值<=18为“ ...

  3. 这42个Python小例子,太走心

    告别枯燥,60秒学会一个Python小例子.奔着此出发点,我在过去1个月,将平时经常使用的代码段换为小例子,分享出来后受到大家的喜欢. 一.基本操作 1 链式比较 i = 3print(1 <  ...

  4. 用Python对体积较大的CSV文件进行比较的经验

    用Python对体积较大的CSV文件进行比较的经验 » 进化的测试 | 进化的测试 用Python对体积较大的CSV文件进行比较的经验  python  Add comments 八 032010   ...

  5. 【Spark调优】小表join大表数据倾斜解决方案

    [使用场景] 对RDD使用join类操作,或者是在Spark SQL中使用join语句时,而且join操作中的一个RDD或表的数据量比较小(例如几百MB或者1~2GB),比较适用此方案. [解决方案] ...

  6. python小工具myqr生成动态二维码

    python小工具myqr生成动态二维码 (一)安装 (二)使用 (一)安装 命令: pip install myqr 安装完成后,就可以在命令行中输入 myqr 查看下使用帮助: myqr --he ...

  7. 掌握这个Python小技巧,轻松构建cytoscape导入文件

    今天小编和大家分享如何借助Python脚本轻松构建cytoscape导入文件.Cytoscape是一个非常适合展示各种相互作用关系的可视化软件. 具体来说就是可以用于蛋白互作网络的展示,miRNA与蛋 ...

  8. 微信小程序理解8大误区,你中招了吗?

    2016年年底程序员话题中最火的是什么?莫过于微信小程序!小程序被炒得沸沸扬扬,再次证明一点,微信想让什么火,真的就能让什么火!这种能力真是全中国再也没有人有了,政府也没有.但是,小程序刚刚开始,你对 ...

  9. 小学生都能学会的python(小数据池)

    小学生都能学会的python(小数据池) 1. 小数据池. 目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建过多的对象 缓存:int, str, bool. int: 缓存范围 -5~256 ...

随机推荐

  1. 为已经存在的本地项目添加git,以及从远程仓库拉取代码并切换远程分支

    前提:先去gitlab或github网站上创建一个新项目,完毕后记得添加.ignore: 1.打开终端​,cd到已存在项目的目录 ​​​2.输入以下命令行,初始化一个本地仓库: ​git init 3 ...

  2. OpenGL 阴影之Shadow Mapping和Shadow Volumes

    先说下开发环境.VS2013,C++空项目,引用glut,glew.glut包含基本窗口操作,免去我们自己新建win32窗口一些操作.glew使我们能使用最新opengl的API,因winodw本身只 ...

  3. 概念:CountDownLatch、CyclicBarrier、Semaphore,以及guava的RateLimiter

    概念 CountDownLatch:一个门闩,作用是将某个线程关在门外,等门里的人分赃完毕(计数为0)的时候,才会打开门,让外面的那个线程执行. CyclicBarrier:直译的话,就是循环障碍.貌 ...

  4. 解决maven jmxtools 缺失的问题

    原因:有版权,所以maven仓库基本都下架了jmxtool. 目前可用的,我就找到了wso2这家,配置如下: <project xmlns="http://maven.apache.o ...

  5. Assets/FollowDestination.cs(6,13): error CS0246: The type or namespace name `NavMeshAgent' could not be found. Are you missing `UnityEngine.AI' using directive?的解决方案

    问题的出现与描述 在Unity中创建一个NPC,使它一直跟踪一个目标Destination,C#脚本代码如下,错误信息描述如下 using System.Collections; using Syst ...

  6. SQL数据查询之——嵌套查询

    一.概念描述 在SQL语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块.将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询称为 嵌套查询.例如: ...

  7. BIO、NIO、AIO系列一:NIO

    一.几个基本概念 1.同步.异步.阻塞.非阻塞 同步:用户触发IO操作,你发起了请求就得等着对方给你返回结果,你不能走,针对调用方的,你发起了请求你等 异步:触发触发了IO操作,即发起了请求以后可以做 ...

  8. C# 委托的同步调用和异步调用

    委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 同步调用的例子: using System; using System.T ...

  9. 多媒体开发之h264中的sps---sps信息提取之帧率

    ------------------------------author:pkf -----------------------------------------time:2015-8-20 --- ...

  10. Java设计模式之五大创建型模式(附实例和详解)

    一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥 ...