国庆几天在家看了几篇关于使用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. Matlab 读取excel文件提示服务器出现意外情况或无法读取问题解决

    1.问题描述: 该错误通常发生在应用函数读取excel文件(后缀xls或xlsx)时. 应用xlsread函数读取提示服务器出现意外情况: 应用importdata读取时提示can‘t open fi ...

  2. linux之sshfs

    1.挂载 sshfs -p shiyu@ml.cs.tsinghua.edu.cn:/mfs/shiyu/ ~/mfs 2.卸载 fusermount -u ~/mfs

  3. mysql查询常用小语句

    mysql  查询某个库里表的数量 在mysql中有个数据库information_schema下的表tables记录了所有数据库中所有的表相关信息 TABLE_SCHEMA 数据库名称 SELECT ...

  4. 看视频 shell入门视频补充的 shell脚本基本知识(TMD有点乱)

    命令的组合: 1. 多个命令的顺序分隔:     1. 顺序分隔,使用 ; 顺序执行;     2. 逻辑与分隔, 使用 && ,  一旦前面的命令执行失败,后面的命令就不会执行;   ...

  5. Linux中的链接文件_软链接和硬链接

    一.链接文件介绍 Linux操作系统中的“链接文件”分为硬链接(hard link)和软链接(symbolic link).两种链接的本质区别在于inode.以下是详细介绍: 硬链接:当系统要读取一个 ...

  6. JDBC简单示例代码

    本文章教程中将演示如何创建一个简单的JDBC应用程序的示例. 这将显示如何打开数据库连接,执行SQL查询并显示结果. 这个示例代码中涉及所有步骤,一些步骤将在本教程的后续章节中进行说明. 创建JDBC ...

  7. Mac环境下配置tomcat的步骤详解

    前言 相信对Java Web稍微知道一点,一般对Tomcat都不会陌生,Apache是普通服务器,本身只支持html即普通网页,可以通过插件支持PHP,还可以与Tomcat连通(单向Apache连接T ...

  8. svn -- svn配置自动启动

    配置自动启动服务 1.添加到系统服务 sc create SVNService binpath=  “D:\subversion\bin\svnserve.exe --service -r D:/sv ...

  9. 创建自己的PKI公/私密钥对和公钥证书

    1. 创建certificate request configuration file cert_req.conf******************************************* ...

  10. vuejs 获取 Input 值

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...