国庆几天在家看了几篇关于使用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. struts2 拦截器配置

    CheckLoginInterceptor.java---拦截器具体实现类: package com.sunhoo.hcpms.struts2.action.interceptors; import  ...

  2. 关于Unity的开发思路

    我现在的思路大概是这样的,2D游戏 Hierachy视图 有一个总的Canvas节点,挂载一个总的游戏控制脚本game_scene,下面有这样一些子节点 1.game_root:下面存放游戏界面中的物 ...

  3. ERROR:tornado上传文件过大超出范围报错

    该怎么解决呢? HTTPServer里面指定max_buffer_size就可以了 EXAMPLE # server = HTTPServer(application, max_buffer_size ...

  4. Linq中string转int的方法

    Linq中string转int的方法   在做批量删除时,需把一串id值所对应的数据删除,调试出现问题: Linq语句中如果使用ToString()进行类型转换,编译时不会报错,但执行时会出现如下错误 ...

  5. gradle 的安装

    前言: 我不是一个勤奋好学的人,奔着新技术就跑去尝试学习.但是在工作或者学习的过程中,遇到了的技术,还是得一个坎一个坎的迈过去.把今天遇到的坎变成明天的垫脚石. 想学习一下 spring 的源码,然后 ...

  6. C# 之HTTP请求get,post带重试参数

    public class WebHttp { /// <summary> /// get请求带重试 /// </summary> /// <param name=&quo ...

  7. Http协议中常用字段总结(不定时完善中)

    1.Http协议概述 关于Http协议的发展,各种资料有很多,在此不再赘述,不明白的小伙伴儿可以去搜一下,Http报文分为请求报文和相应报文,由于Http是面向文本的,因此在报文中的每一个字段都是一些 ...

  8. PHP替换回车换行的三种方法

    一个小小的换行,其实在不同的平台有着不同的实现,为什么要这样,世界是多样的! 本来在Unix世界换行用/n来代替换行, Windows为了体现不同,就用/r/n, 更有意思的是,Mac中又用了/r. ...

  9. Hotspot JVM的常用选项

    Hotspot JVM的常用选项 选项的分类 Hotspot JVM提供以下三大类选项: 1. 标准选项:这类选项的功能是很稳定的,在后续版本中也不太会发生变化.运行java或者java -help可 ...

  10. 猫猫学iOS之小知识iOS启动动画_Launch Screen的运用

    猫猫分享,必须精品 原创文章.欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243? viewmode=contents 看下效果吧 比如新浪微博的 ...