随想录(豆瓣网站的爬行)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

喜欢看电影的同学对豆瓣肯定不是很陌生。一般我们在选择将要看的电影之前,都会到豆瓣上看一看评价如何。如果评价太低的话,其实看得意义不大了,相反如果看的价值很过,那无论如何使不能错过的。豆瓣的积分大部分是准确的,但是也不能排除恶意刷积分的情况。
    很长时间以来,自己都想把豆瓣上所有好看的电影一网打尽,但是苦于没有现成的工具,只好自己来写。现在的脚本语言比较多,python、go都可以完成这么一项任务。简单的几句就可以完成很多的工作。
    要想完成这么一个任务,我们可以拆成几个事情来做?比如说怎么下载网页?怎么获取电影名称?怎么获取积分?怎么爬行等等。

首先,还是放出我自己写的豆瓣电影爬行代码,如下所示,

#encoding=utf-8
#!/usr/bin/python

import os
import sys
import re
import time
import smtplib
import urllib
import urllib2
import traceback
from urllib import urlopen

page=[]

def check_num_exist(data):
	for i in range(0, len(page)):
		if data==page[i]:
			return True
	return False

if __name__ == ‘__main__‘:

	num = 0;
	page.append(‘25788662‘)

	while num < len(page):

		‘‘‘sleep‘‘‘
		time.sleep(2)

		‘‘‘produce url address‘‘‘
		url = ‘http://movie.douban.com/subject/‘ + page[num]
		num += 1

		‘‘‘get web data	‘‘‘
		req = urllib2.Request(str(url))
		req.add_header(‘User-Agent‘,‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11‘)

		try:
			request = urllib2.urlopen(req)

		except urllib2.URLError, e:
			continue

		except urllib2.HTTPError, e:
			continue

		webdata = request.read()

		‘‘‘get title ‘‘‘
		find=re.search(r‘<title>\n(.*?)\(.*?\)\n</title>‘,webdata)
		if( None == find):
			continue;

		title = find.group(1).strip().decode(‘utf-8‘)

		‘‘‘get score‘‘‘
		find=re.search(r‘<strong class=.*? property=.*?>(\d\.\d)‘,webdata)
		if( None == find):
			continue;

		score = find.group(1)

		‘‘‘print info about the film ‘‘‘

		print (‘%s %s %s‘) %(url,title,score)

		‘‘‘print webdata‘‘‘
		find=re.findall(r‘http://movie.douban.com/subject/(\d{7,8})‘, webdata)
		if( 0 == len(find)):
			continue;

		for i in range(0,len(find)):
			if(False == check_num_exist(find[i])):
				page.append(find[i])

(1)web page的下载非常简单,urllib2公式就可以解决;
    (2)获取title和score主要靠正则表达式来完成;
    (3)web爬行的方法,这里采用了深度优先的选择,比较简单,也比较容易实现;
    (4)很多时候,网站会对连续的外部爬行进行屏蔽处理,所以需要用add_header将我们伪装成浏览器访问;
    (5)web爬行不能太过分,一般中间要有sleep几秒钟;
    (6)爬行过程中的所有异常都要考虑到,否则无法长时间运行;
    (7)积极发现web网页的规律,比如说豆瓣电影基本都是movie.douban.com/subject/*的结构;
    (8)大胆尝试,积极改错就可以了,很少能一步到位的。

上面的只是电影的爬行,简单改造一下就是书的查询,

#encoding=utf-8
#!/usr/bin/python

import os
import sys
import re
import time
import smtplib
import urllib
import urllib2
import traceback
from urllib import urlopen

page=[]

def check_num_exist(data):
	for i in range(0, len(page)):
		if data==page[i]:
			return True
	return False

if __name__ == ‘__main__‘:

	num = 0;
	page.append(‘25843109‘)

	while num < len(page):

		‘‘‘sleep‘‘‘
		time.sleep(2)

		‘‘‘produce url address‘‘‘
		url = ‘http://book.douban.com/subject/‘ + page[num]
		num += 1

		‘‘‘get web data	‘‘‘
		req = urllib2.Request(str(url))
		req.add_header(‘User-Agent‘,‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11‘)

		try:
			request = urllib2.urlopen(req)

		except urllib2.URLError, e:
			continue

		except urllib2.HTTPError, e:
			continue

		webdata = request.read()

		‘‘‘get title ‘‘‘
		find=re.search(r‘<title>(.*?)\(.*?\)</title>‘,webdata)
		if( None == find):
			continue;

		title = find.group(1).strip().decode(‘utf-8‘)

		‘‘‘get score‘‘‘
		find=re.search(r‘<strong class=.*? property=.*?>\n.*?(\d\.\d)‘,webdata)
		if( None == find):
			continue;

		score = find.group(1)

		‘‘‘print info about the film ‘‘‘

		print (‘%s %s %s‘) %(url,title,score)

		‘‘‘print webdata‘‘‘
		find=re.findall(r‘http://book.douban.com/subject/(\d{7,8})‘, webdata)
		if( 0 == len(find)):
			continue;

		for i in range(0,len(find)):
			if(False == check_num_exist(find[i])):
				page.append(find[i])

还有音乐的爬行,

#encoding=utf-8
#!/usr/bin/python

import os
import sys
import re
import time
import smtplib
import urllib
import urllib2
import traceback
from urllib import urlopen

page=[]

def check_num_exist(data):
	for i in range(0, len(page)):
		if data==page[i]:
			return True
	return False

if __name__ == ‘__main__‘:

	num = 0;
	page.append(‘25720661‘)

	while num < len(page):

		‘‘‘sleep‘‘‘
		time.sleep(2)

		‘‘‘produce url address‘‘‘
		url = ‘http://music.douban.com/subject/‘ + page[num]
		num += 1

		‘‘‘get web data	‘‘‘
		req = urllib2.Request(str(url))
		req.add_header(‘User-Agent‘,‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11‘)

		try:
			request = urllib2.urlopen(req)

		except urllib2.URLError, e:
			continue

		except urllib2.HTTPError, e:
			continue

		webdata = request.read()

		‘‘‘get title ‘‘‘
		find=re.search(r‘<title>\n(.*?)\(.*?\)\n</title>‘,webdata)
		if( None == find):
			continue;

		title = find.group(1).strip().decode(‘utf-8‘)

		‘‘‘get score‘‘‘
		find=re.search(r‘<strong class=.*? property=.*?>(\d\.\d)‘,webdata)
		if( None == find):
			continue;

		score = find.group(1)

		‘‘‘print info about the film ‘‘‘

		print (‘%s %s %s‘) %(url,title,score)

		‘‘‘print webdata‘‘‘
		find=re.findall(r‘http://music.douban.com/subject/(\d{7,8})‘, webdata)
		if( 0 == len(find)):
			continue;

		for i in range(0,len(find)):
			if(False == check_num_exist(find[i])):
				page.append(find[i])

最后,就是兴趣小组的爬行,这是最好玩的。你可以看到很多搞笑的兴趣小组,

#encoding=utf-8
#!/usr/bin/python

import os
import sys
import re
import time
import smtplib
import urllib
import urllib2
import traceback
from urllib import urlopen

page=[]

def check_num_exist(data):
	for i in range(0, len(page)):
		if data==page[i]:
			return True
	return False

if __name__ == ‘__main__‘:

	num = 0;
	page.append(‘angel‘)

	while num < len(page):

		‘‘‘sleep‘‘‘
		time.sleep(2)

		‘‘‘produce url address‘‘‘
		url = ‘http://www.douban.com/group/‘ + page[num]
		num += 1

		‘‘‘get web data	‘‘‘
		req = urllib2.Request(str(url))
		req.add_header(‘User-Agent‘,‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11‘)

		try:
			request = urllib2.urlopen(req)

		except urllib2.URLError, e:
			continue

		except urllib2.HTTPError, e:
			continue

		webdata = request.read()

		‘‘‘get title ‘‘‘
		find=re.search(r‘<title>\n(.*?)\n</title>‘,webdata)
		if( None == find):
			continue;

		title = find.group(1).strip().decode(‘utf-8‘)

		‘‘‘print info about the film ‘‘‘

		print (‘%s %s‘) %(url,title)

		‘‘‘print webdata‘‘‘
		find=re.findall(r‘http://www.douban.com/group/([\w|\d]+?)/‘, webdata)
		if( 0 == len(find)):
			continue;

		for i in range(0,len(find)):
			if(False == check_num_exist(find[i])):
				page.append(find[i])

最后,还是希望大家爬行豆瓣的时候,尽量文明一点。太频繁的话,会被server forbidden的。

时间: 2024-10-19 02:46:25

随想录(豆瓣网站的爬行)的相关文章

python网站目录爬行

default.php index.php view.html.php helper.php controller.php frontend.php backend.php colorConfig.ini.php config.php router.php view.php search.php user.php menu.php admin.php main.php header.php form.php modules.php installer.php footer.php compone

外贸网站建设,五个细节决定用户体验度

外贸网站是很多营销网站争相建设的网站,但是外贸网站的建设并不容易.想要在外贸网站这条道路上越走越好,那么一定要做好用户体验.下面就分别从五个方面的细节来分析一下外贸行业创建网站的用户体验. 首先就是网站在域名上的选择.无论是什么类型的用户,有什么类型的需求,在域名的选择上都有一个准则.第一,域名一定要是容易记忆的.第二.域名中一定包括网站的关键字.第三.网站的域名一定要有企业品牌的字母.这就是域名选择的一个准则.从推广角度来说,带有关键字的域名是最好的.如果重点是在品牌上,那么有品牌字母的域名就

Node.js学习 爬虫下载豆瓣电影top250图片

利用node.js实现爬虫,并且爬取豆瓣电影top250的列表和图片. 1 什么是node.js 简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台.Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎 2 什么是爬虫 (又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 3

团队-张宸-需求分析-python爬虫分类爬取豆瓣电影

首先要明白爬网页实际上就是:找到包含我们需要的信息的网址(URL)列表通过 HTTP 协议把页面下载回来从页面的 HTML 中解析出需要的信息找到更多这个的 URL,回到 2 继续其次还要明白:一个好的列表应该:包含足够多的电影的 URL通过翻页,可以遍历到所有的电影一个按照更新时间排序的列表,可以更快抓到最新更新的电影最后模拟过程知道豆瓣网站不能一次性爬取所有信息,只能分类爬取使用工具pyspider分析完成实现代码,测试模拟运行,按照时间列表爬取每类最新电影资讯团队成员:张文然,张宸

豆瓣技术架构调研

关键字包括:nginx,lighttpd,quixote,Memcached,mogile FS,Mako,Gentoo Linux,Xapian,spreadps:窃以为第一段关于语言的采访,相当[csdn]化 你要是愿意,就买一枝三块钱的玫瑰,送给我吧,这城市也是怪让人伤心的,我想死心塌地的爱上你”   这是一个叫钟童茜的歌手的歌,我在豆瓣网站发现有人评论,才知道了这首有些凄凉的歌曲.你几乎不可能从百度的最流行的mp3的列表中找到它,因为它不是那么有名,也许是这个原因,引发了我采访豆瓣的愿望

PHP网站首页打不开的原因讲起

最近有个网站首页打不开,偶尔报504错误,如图所示,这是nginx直接返回的. 今天下午16:00多又出现了,看了下阿里云数据库连接,其实在晚上2:00也出现了一次.这个图是后来问题已经解决了获取的,数据库连接的请求数已经降下来了. 现在似乎是数据库压力很大,由于我们的数据库服务器同时有好几个库在线上,并不确定是其他系统把数据库拖垮还是当前这个系统的原因. 使用语句查询数据库的会话数 SQLSERVER 查看当前连接数Select * from sys.dm_exec_connections -

新手如何掌握制作和提交网站地图?

新手如何掌握制作和提交网站地图? 网站地图作为根据网站的结构,框架,内容生成的导航网页文件. 大多数人都知道网站地图对于提高用户体验有好处:它们为网站访问者指明方向,并帮助迷失的访问者找到他们想看的页面. 那么什么是网站地图呢? 在开始介绍网站地图的制作与提交之前,我们有必要先了解一下什么是网站地图. 网站地图也就是sitemap,是一个网站所有链接的容器.很多网站的链接层次比较深,蜘蛛是很难抓取到的,网站地图可以方便搜索引擎蜘蛛抓取网站页面,通过抓取网站页面,可以清晰的了解网站的架构.网站地图

如何选择一个更有利于网站建设与优化的主机

主机对网站优化的影响是显而易见的,一方面是体现在主机的性能好不好,会不会经常死机.访问速度快不快.打开一个网页需要多久.是不是支持对网站日志的读 写.支不支持URL重写操作:另一方面,体现在主机以往的履历,该主机上,其他网站是什么类型的,有没有包含被禁止的内容,出现在网站上,主机上被惩罚的 网站多不多等等.下面就来具体分析一下,建立网站,应该选择什么样的主机.一个完美的主机,对网站排名的重要性. 选择怎么样的主机? 要点一.主机的IP或者整个服务器是否有被惩罚过 分析:一个IP或者整个服务器上所

团队-张文然-需求分析-python爬虫分类爬取豆瓣电影信息

首先要明白爬网页实际上就是:找到包含我们需要的信息的网址(URL)列表通过 HTTP 协议把页面下载回来从页面的 HTML 中解析出需要的信息找到更多这个的 URL,回到 2 继续其次还要明白:一个好的列表应该:包含足够多的电影的 URL通过翻页,可以遍历到所有的电影一个按照更新时间排序的列表,可以更快抓到最新更新的电影最后模拟过程知道豆瓣网站不能一次性爬取所有信息,只能分类爬取使用工具pyspider分析完成实现代码,测试模拟运行,按照时间列表爬取每类最新电影资讯 代码分解,便于加入团队后组员