国庆几天在家看了几篇关于使用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的主版本号和次版本号)
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