当前位置: 首页 > 编程日记 > 正文

[Python]小百合十大爬虫

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

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

零基础自学用Python 3开发网络爬虫-这篇博客写的不错,通俗易懂,文笔也很好
知乎上关于如何使用Python来编爬虫的解答1
知乎上关于如何使用Python来编爬虫的解答2
正则表达式30分钟入门

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

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的主版本号和次版本号)

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

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

2.爬取十大各帖内容

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

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

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

完整代码如下所示:

 1 # -*- coding: cp936 -*-
 2 import urllib2
 3 import urllib
 4 import re
 5 # 自定义帖子类,包括十大排名、板块链接、板块名、帖子链接、帖子标题、作者链接和作者 7个字段
 6 class Article:
 7     def __init__(self, rank, board_link, board, article_link, title, author_link, author):
 8         self.rank = rank
 9         self.board_link = board_link
10         self.board = board
11         self.article_link = article_link
12         self.title = title
13         self.author_link = author_link
14         self.author = author
15 
16 class Lily_Top10_Spider:
17     def __init__(self):
18         self.top10 = []
19         self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
20         self.headers = {'User-Agent' : self.user_agent}
21         
22 
23     # 获取十大信息,添加到列表中并返回列表
24     def get_top10article(self):
25         top10_url = 'http://bbs.nju.edu.cn/bbstop10'
26         bbs_url = 'http://bbs.nju.edu.cn/'
27         
28         req = urllib2.Request(top10_url, headers = self.headers)
29         response = urllib2.urlopen(req)
30         top10_page = response.read()
31         #print top10_page
32         
33         #unicode_top10_page = top10_page.decode('utf-8')
34         pattern_str = '<tr.*?bgcolor=.*?><td>(.*?)<td><a.*?href=(.*?)>(.*?)</a><td><a.*?href="(.*?)">(.*?)\n</a><td><a.*?href=(.*?)>(.*?)</a><td>(.*?)\n'
35         pattern = re.compile(pattern_str)
36         #pattern = re.compile(r'<tr.*?bgcolor=.*?><td>(.*?)<td><a.*?href=(.*?)>(.*?)</a><td><a.*?href="(.*?)">(.*?)</a><td><a.*?href=(.*?)>(.*?)</a>')
37         top10_retrive_infos = pattern.findall(top10_page)
38         for info in top10_retrive_infos:
39             article = Article(info[0], bbs_url + info[1], info[2], bbs_url + info[3], info[4], bbs_url + info[5], info[6])
40             self.top10.append(article)
41             #print info
42             
43 
44         for a in self.top10:
45             print a.title, ' ', a.author, ' ', a.board, ' ', a.article_link
46 
47     def get_article(self, url):
48         # url + '&start=-1' 显示本主题全部帖子
49         all_article_url = url + '&start=-1'
50         req = urllib2.Request(all_article_url, headers = self.headers)
51         response = urllib2.urlopen(req)
52         article_content = response.read()
53         #print article_content
54         
55 
56         # use regular experssion to find out all the reply article content
57         pattern_str = '<textarea.*?id=.*?class=hide>(.*?)--\n.*?</textarea>'
58         pattern = re.compile(pattern_str, re.S)
59         all_replies_content = pattern.findall(article_content)
60 
61         f = open('all_replies_content.txt', 'w')
62         #print all_replies
63 
64         result_content = []
65         for reply in all_replies_content:
66             f.write(reply)
67             result_content.append(reply)
68             #print reply
69         return result_content
70         #return self.top10
71         
72    
73 ls = Lily_Top10_Spider()
74 ls.get_top10article()
75 
76 print '#1 article content:'
77 article_content = ls.get_article(ls.top10[9].article_link)
78 for s in article_content:
79     print s
80 print 'print end.'
81             

参考文献:HOWTO Fetch Internet Resources Using urllib2
Python爬虫入门教程

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

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

相关文章:

Web自动化测试 六 ----- selector选择

1、一般情况下都是先定位元素在选择 from selenium.webdriver import Chrome from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as ECdriver Chrome()dr…

AI矢量绘图软件技能学习视频教程

AI矢量绘图软件技能学习视频教程 技能分享——Adobe Illustrator CC——精粹大师班 云桥网络 平台 获取 教程 时长:5h 42m |视频:。MKV 1280720&#xff0c;30 fps(r) |音频:AAC&#xff0c;44100 Hz&#xff0c;2ch |大小解压后:2.27 GB 语言&#xff1a;英语中英文字幕&am…

利用JS判断是手机端还是PC端 浏览网站

引入百度JS&#xff1a; <script src"http://siteapp.baidu.com/static/webappservice/uaredirect.js" type"text/javascript"></script> <script type"text/javascript">uaredirect("这里写跳转手机端网页地址");&…

职校中的计算机学的是什么,职校计算机专业主要学什么课

职校计算机专业主要学什么课2020-11-19 15:37:41文/樊越很多同学都知道计算机是近几年的大热门课程&#xff0c;小编整理了一些计算机专业的课程&#xff0c;大家一起来看看吧。计算机专业课程学习计算机的基本原理、基本结构、基本算法、基本设计等。主课程&#xff1a;计算机…

浅谈MySQL存储引擎-InnoDBMyISAM

浅谈MySQL存储引擎-InnoDB&MyISAM 存储引擎在MySQL的逻辑架构中位于第三层&#xff0c;负责MySQL中的数据的存储和提取。MySQL存储引擎有很多&#xff0c;不同的存储引擎保存数据和索引的方式是不同的。每一种存储引擎都有它的优势和劣势&#xff0c;本文只讨论最常见的In…

android ValueAnimator学习

2019独角兽企业重金招聘Python工程师标准>>> 一、简介 This class provides a simple timing engine for running animations which calculate animated values and set them on target objects. There is a single timing pulse that all animations use. It runs …

Annotation

在进行类或方法定义的时候&#xff0c;都可以使用一系列的Annotation&#xff08;public interface Annotation&#xff09;进行声明&#xff0c;如果想要获取这些Annotation的信息&#xff0c;可以直接通过反射来完成。在 java.lang.reflect 里面有一个AccessibleObject类&…

GSG灰猩猩插件合集包

GSG灰猩猩插件合集包 GSG灰度大猩猩Plus中心插件HDRI和材料2021年 大小&#xff1a;59G 信息: 云桥网络 平台获取素材 这是最新的(截至2021年4月29日)GSG Plus HUB&#xff0c;包括Plus订阅的所有插件、材料和HDRIs。 支持c4d版本:R23、S24(仅限Windows) 该包包含最新的GS…

百度地图JavaScript API自定义覆盖物、自定义信息窗口增删时的显示问题

项目中&#xff0c;需求&#xff1a;在百度地图上实时画出车辆&#xff0c;并能点击车辆弹出信息框查看实时信息。 实现&#xff1a;通过不停的画覆盖物并删除掉。点击覆盖物时弹出信息窗口。 问题&#xff1a;删除掉覆盖物后信息窗也删除掉了。因为信息窗是建立在覆盖物的基础…

英语计算机工程师求职信,电脑工程师的英文求职信样文

电脑工程师的英文求职信样文应届毕业生推荐是电脑工程师的英文求职信样文Dear Ms. Swainsforth:I am a registered engineer in the state of Michigan, and I am presently seeking a position in the roofing industry. A copy of my resume is enclosed, and I would like t…

java工程webservice的应用案例

在java项目中使用webservice 今天学习webservice&#xff0c;主要参考了网络上的一些文章。 1.关于原理的介绍&#xff1a;个人认为这篇文章写得不错了&#xff0c;戳这里。 2.关于demo的编写&#xff1a;个人认为这篇文章很简洁&#xff0c;也能运行成功&#xff0c;戳这里…

Vijos1683 有根树的同构问题

题目大意: 给出一堆树,求同构(拓扑结构相同)树的集合思路: 一开始写了个前序求置换序列,然后对比后序是否相等,但wa了,还需要对子树进行排序输出其dfs序,但是直接输出按节点多少排序的序列太复杂,于是将一个节点的dfs抽象成\(()\),于是对树\(1 -> 2 , 1 -> 3\)输出的dfs序…

3D广告建模-C4D Octane渲染视频教程

3D广告建模-C4D Octane渲染视频教程 时长4h 58m 960X540 MP4 大小解压后&#xff1a;833M 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 信息: 云桥网络 平台 huo取 教程 C4D中Octane渲染的三维广告建模视频教程 包含字幕 了解如何在…

vue实例没有挂载到html上,vue 源码学习 - 实例挂载

前言在学习vue源码之前需要先了解源码目录设计(了解各个模块的功能)丶Flow语法。src├── compiler # 把模板解析成 ast 语法树&#xff0c;ast 语法树优化&#xff0c;代码生成等功能。├── core # 核心代码 Vue.js 的灵魂├── platforms # 不同平台的支持 web 和 weex├…

为何Redis要比Memcached好用(转)

转载链接&#xff1a;http://blog.csdn.net/renfufei/article/details/40598889 GitHub版本地址: https://github.com/cncounter/translation/blob/master/tiemao_2014/Redis_beats_Memcached/Redis_beats_Memcached.md 副标题: Redis是新兴的通用存储系统,而Memcached仍有其适…

2022-2028年中国数字化制造产业研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国数字化制造行业市场行业相关概述、中国数字化制造行业市场行业运行环境、分析了中国数字化…

转载知乎上的一篇:“ 面向对象编程的弊端是什么?”

2019独角兽企业重金招聘Python工程师标准>>> 弊端是&#xff0c;没有人还记得面向对象原本要解决的问题是什么。1、面向对象原本要解决什么&#xff08;或者说有什么优良特性&#xff09;似乎很简单&#xff0c;但实际又很不简单&#xff1a;面向对象三要素封装、继…

Windows Azure 如何学习Azure

通过上一篇博文可以得知&#xff0c;Azure其实是个平台&#xff0c;上面跑的服务五花八门&#xff0c;可以相互分开使用&#xff0c;同时也可以相互结合。 那我们应该如何来学习Azure呢? 其实有很多种选择&#xff0c;正所谓条条大路通罗马&#xff0c; 官方的training kit 提…

最全面的Unity游戏开发指南视频教程 第2卷

最全面的Unity游戏开发指南视频教程 第2卷 流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:4.2 GB |时长:9h 24m 含项目文件 Unity游戏开发…

IOS面试题(二)

50. 谈谈对Block 的理解?并写出一个使用Block执行UIVew动画? 答&#xff1a;Block是可以获取其他函数局部变量的匿名函数&#xff0c;其不但方便开发&#xff0c;并且可以大幅提高应用的执行效率(多核心CPU可直接处理Block指令) 1 2 3 4 5 [UIView transitionWithView:self.…

辽宁省计算机专业A类,辽宁省2008年中职升高职招生考试计算机专业综合试题

辽宁省2008年中职升高职招生考试计算机及应用专业综合课试卷第一部分 必答题(200分)一、单项选择题(在每小题的四个备选答案中&#xff0c;选出一个正确的答案。每小题4分&#xff0c;共44分)1、在数据通信中&#xff0c;将模拟信号变换为数字信号的过程称为A 编码 B解码 C解调…

MyBatis的插入后获得主键的方式

需求&#xff1a; 使用MyBatis往MySQL数据库中插入一条记录后&#xff0c;需要返回该条记录的自增主键值。 方法&#xff1a; 在mapper中指定keyProperty属性&#xff0c;示例如下&#xff1a; <insert id"insertUser" useGeneratedKeys"true" keyP…

JAVA 中 13 种锁的实现方式

分布式系统时代,线程并发,资源抢占,慢慢变得很重要。那么常见的锁都有哪些?

String的Intern()方法,详解字符串常量池!

字符串拼接最好使用StringBuilder调用append来拼接。使用加号“+”拼接,会new一个StringBuilder,并且在最后调用toString方法时还会new String()。内存中由于创建了较多的StringBuilder和String对象,还有一方面是内存占用,调用GC还会额外花费时间。所以,字符串拼接直接使用StringBuilder会大大提高性能,尤其是多个字符串拼接。

硬盘盘符双击无法打开,只能右键打开(解决方法)(转载)

开始---运行---cmd&#xff0c;例如D盘&#xff0c;就输入  D: dir /a &#xff08;没有参数A是看不到的&#xff0c;A是显示所有的意思&#xff09; 此时你会发现一个autorun.inf文件   attrib autorun.inf -s -h -r 去掉autorun.inf文件的系统、只读、隐藏属性&#xff0…

Unity 2021创建2D休闲点击器游戏视频教程

Unity 2021创建2D休闲点击器游戏视频教程 Learn how to create a 2D Idle Clicker Game in Unity 2021 了解如何在Unity 2021中创建2D闲置点击器游戏 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&…

html实现pdf预览打印机,Pdf操作(HTML转PDF,PDF直接网页连接打印机)

Pdf导出的操作&#xff1a;引用TuesPechkin.dll和TuesPechkin.Wkhtmltox.AnyCPU.dll程序集&#xff0c;新建PDF静态类 PDFConverter&#xff0c;在web.config配置保存dir/// ///pdf转换/// public static classPdfConvert {/// ///staticDeploymentPath/// private static read…

CUDA编程遇到的问题

1、总喜欢在core 代码中&#xff0c;访问device memory。 然后排错很久&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 2、第一次cudaMalloc() 耗时很久 3、cudaMalloc对于大数据也耗时很久 4、一致内存使用错误&#xff0c;不知道为什么&#xff01;&#xff…

2022-2028年中国数字化档案加工行业市场深度分析及发展策略分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国数字化档案加工行业市场行业相关概述、中国数字化档案加工行业市场行业运行环境、分析了中…

eclipse打开处于无响应状态解决办法

eclipse打开后处于无响应状态&#xff0c;变没有了反映&#xff0c;并且cup占用率为0。应该是非正常关机导致eclipse工作区的文件状态错误导致。 解决方案&#xff1a;在工作区目录中&#xff0c;有一个.metadata目录&#xff0c;里面是工作区及各插件的信息&#xff0c;删除此…