- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
安装部署Scrapy 。
在安装Scrapy前首先需要确定的是已经安装好了Python(目前Scrapy支持Python2.5,Python2.6和Python2.7)。官方文档中介绍了三种方法进行安装,我采用的是使用 easy_install 进行安装,首先是下载Windows版本的setuptools(下载地址:http://pypi.python.org/pypi/setuptools),下载完后一路NEXT就可以了。 安装完setuptool以后。执行CMD,然后运行一下命令:
1
|
easy_install
-U
Scrapy
|
同样的你可以选择使用pip安装,pip的地址:http://pypi.python.org/pypi/pip 使用pip安装Scrapy的命令为 。
1
|
pip install Scrapy
|
如果你的电脑先前装过visual studio 2008 或 visual studio 2010那么一起顺利,Scrapy已经安装完成。如果出现下列报错:Unable to find vcvarsall.bat 那么你需要折腾下。你可以安装visual studio 后进行安装或采用下面的方式进行解决: 首先安装MinGW(MinGW下载地址:http://sourceforge.net/projects/mingw/files/),在MinGW的安装目录下找到bin的文件夹,找到mingw32-make.exe,复制一份更名为make.exe; 把MinGW的路径添加到环境变量path中,比如我把MinGW安装到D:\MinGW\中,就把D:\MinGW\bin添加到path中; 打开命令行窗口,在命令行窗口中进入到要安装代码的目录下; 输入如下命令 setup.py install build –compiler=mingw32 就可以安装了.
如果出现“xslt-config' 不是内部或外部命令,也不是可运行的程序或批处理文件。”错误,原因主要是lxml安装不成功,只要上http://pypi.python.org/simple/lxml/下载个exe文件进行安装就可以了。 下面就可以进入正题了.
新建工程 让我们来用爬虫获取豆瓣电影Top 250的电影信息吧。开始之前,我们新建一个Scrapy工程。因为我用的Win7,所以在CMD中进入一个我希望保存代码的目录,然后执行:
1
|
D:\WEB\Python>scrapy startproject doubanmoive
|
这个命令会在当前目录下创建一个新的目录doubanmoive,目录结构如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
D:\WEB\Python\doubanmoive>tree /f
Folder PATH listing for volume Data
Volume serial number is 00000200 34EC:9CB9
D:.
│ scrapy.cfg
│
└─doubanmoive
│ items.py
│ pipelines.py
│ settings.py
│ __init__.py
│
└─spiders
__init__.py
|
这些文件主要为:
定义项目(Item) 。
Item是用来装载抓取数据的容器,和Java里的实体类(Entity)比较像,打开doubanmoive/items.py可以看到默认创建了以下代码.
1
2
3
4
|
from
scrapy.item
import
Item, Field
class
DoubanmoiveItem(Item):
pass
|
我们只需要在 Doubanmoive 类中增加需要抓取的字段即可,如 name=Field() ,最后根据我们的需求完成代码如下.
1
2
3
4
5
6
7
8
9
|
from
scrapy.item
import
Item, Field
class
DoubanmoiveItem(Item):
name
=
Field()
#电影名
year
=
Field()
#上映年份
score
=
Field()
#豆瓣分数
director
=
Field()
#导演
classification
=
Field()
#分类
actor
=
Field()
#演员
|
编写爬虫(Spider) 。
Spider是整个项目中最核心的类,在这个类里我们会定义抓取对象(域名、URL)以及抓取规则。Scrapy官方文档中的教程是基于 BaseSpider 的,但 BaseSpider 只能爬取给定的URL列表,无法根据一个初始的URL向外拓展。不过除了 BaseSpider ,还有很多可以直接继承 Spider 的类,比如 scrapy.contrib.spiders.CrawlSpider .
在 doubanmoive/spiders 目录下新建moive_spider.py文件,并填写代码.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# -*- coding: utf-8 -*-
from
scrapy.selector
import
Selector
from
scrapy.contrib.spiders
import
CrawlSpider,Rule
from
scrapy.contrib.linkextractors.sgml
import
SgmlLinkExtractor
from
doubanmoive.items
import
DoubanmoiveItem
class
MoiveSpider(CrawlSpider):
name
=
"doubanmoive"
allowed_domains
=
[
"movie.douban.com"
]
start_urls
=
[
"http://movie.douban.com/top250"
]
rules
=
[
Rule(SgmlLinkExtractor(allow
=
(r
'http://movie.douban.com/top250\?start=\d+.*'
))),
Rule(SgmlLinkExtractor(allow
=
(r
'http://movie.douban.com/subject/\d+'
)),callback
=
"parse_item"
),
]
def
parse_item(
self
,response):
sel
=
Selector(response)
item
=
DoubanmoiveItem()
item[
'name'
]
=
sel.xpath(
'//*[@id="content"]/h1/span[1]/text()'
).extract()
item[
'year'
]
=
sel.xpath(
'//*[@id="content"]/h1/span[2]/text()'
).re(r
'\((\d+)\)'
)
item[
'score'
]
=
sel.xpath(
'//*[@id="interest_sectl"]/div/p[1]/strong/text()'
).extract()
item[
'director'
]
=
sel.xpath(
'//*[@id="info"]/span[1]/a/text()'
).extract()
item[
'classification'
]
=
sel.xpath(
'//span[@property="v:genre"]/text()'
).extract()
item[
'actor'
]
=
sel.xpath(
'//*[@id="info"]/span[3]/a[1]/text()'
).extract()
return
item
|
代码说明: MoiveSpider 继承Scrapy中的 CrawlSpider , name , allow_domains , start_url 看名字就知道什么含义,其中rules稍微复杂一些,定义了URL的抓取规则,符合 allow 正则表达式的链接都会加入到Scheduler(调度程序)。通过分析豆瓣电影Top250的分页URL http://movie.douban.com/top250?start=25&filter=&type= 可以得到以下规则 。
Rule(SgmlLinkExtractor(allow=(r'http://movie.douban.com/top250\?start=\d+.*'))), 而我们真正要抓取的页面是每一个电影的详细介绍,如肖申克的救赎的链接为 http://movie.douban.com/subject/1292052/ ,那只有 subject 后面的数字是变化的,根据正则表达式得到如下代码。我们需要抓取这种类型链接中的内容,于是加入callback属性,将Response交给parse_item函数来处理.
Rule(SgmlLinkExtractor(allow=(r'http://movie.douban.com/subject/\d+')),callback="parse_item"), 在 parse_item 函数中的处理逻辑非常简单,获取符合条件链接的代码,然后根据一定的规则抓取内容赋给item并返回 Item Pipeline 。获取大部分标签的内容不需要编写复杂的正则表达式,我们可以使用 XPath 。 XPath 是一门在 XML 文档中查找信息的语言,但它也可以用在HTML中。下表列出了常用表达式.
。
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
存储数据 。
爬虫获取到数据以后我们需要将其存储到数据库中,之前我们提到该操作需要靠项目管道(pipeline)来处理,其通常执行的操作为:
由于我们获取的数据格式多种多样,有一些存储在关系型数据库中并不方便,所以我在写完MySQL版本的Pipeline之后又写了一个MongoDB的.
MySQL版本: 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
# -*- coding: utf-8 -*-
from
scrapy
import
log
from
twisted.enterprise
import
adbapi
from
scrapy.http
import
Request
import
MySQLdb
import
MySQLdb.cursors
class
DoubanmoivePipeline(
object
):
def
__init__(
self
):
self
.dbpool
=
adbapi.ConnectionPool(
'MySQLdb'
,
db
=
'python'
,
user
=
'root'
,
passwd
=
'root'
,
cursorclass
=
MySQLdb.cursors.DictCursor,
charset
=
'utf8'
,
use_unicode
=
False
)
def
process_item(
self
, item, spider):
query
=
self
.dbpool.runInteraction(
self
._conditional_insert, item)
query.addErrback(
self
.handle_error)
return
item
def
_conditional_insert(
self
,tx,item):
tx.execute(
"select * from doubanmoive where m_name= %s"
,(item[
'name'
][
0
],))
result
=
tx.fetchone()
log.msg(result,level
=
log.DEBUG)
print
result
if
result:
log.msg(
"Item already stored in db:%s"
%
item,level
=
log.DEBUG)
else
:
classification
=
actor
=
''
lenClassification
=
len
(item[
'classification'
])
lenActor
=
len
(item[
'actor'
])
for
n
in
xrange
(lenClassification):
classification
+
=
item[
'classification'
][n]
if
n<lenClassification
-
1
:
classification
+
=
'/'
for
n
in
xrange
(lenActor):
actor
+
=
item[
'actor'
][n]
if
n<lenActor
-
1
:
actor
+
=
'/'
tx.execute(\
"insert into doubanmoive (m_name,m_year,m_score,m_director,m_classification,m_actor) values (%s,%s,%s,%s,%s,%s)"
,\
(item[
'name'
][
0
],item[
'year'
][
0
],item[
'score'
][
0
],item[
'director'
][
0
],classification,actor))
log.msg(
"Item stored in db: %s"
%
item, level
=
log.DEBUG)
def
handle_error(
self
, e):
log.err(e)
|
MongoDB版本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
# -*- coding: utf-8 -*-
import
pymongo
from
scrapy.exceptions
import
DropItem
from
scrapy.conf
import
settings
from
scrapy
import
log
class
MongoDBPipeline(
object
):
#Connect to the MongoDB database
def
__init__(
self
):
connection
=
pymongo.Connection(settings[
'MONGODB_SERVER'
], settings[
'MONGODB_PORT'
])
db
=
connection[settings[
'MONGODB_DB'
]]
self
.collection
=
db[settings[
'MONGODB_COLLECTION'
]]
def
process_item(
self
, item, spider):
#Remove invalid data
valid
=
True
for
data
in
item:
if
not
data:
valid
=
False
raise
DropItem(
"Missing %s of blogpost from %s"
%
(data, item[
'url'
]))
if
valid:
#Insert data into database
new_moive
=
[{
"name"
:item[
'name'
][
0
],
"year"
:item[
'year'
][
0
],
"score"
:item[
'score'
][
0
],
"director"
:item[
'director'
],
"classification"
:item[
'classification'
],
"actor"
:item[
'actor'
]
}]
self
.collection.insert(new_moive)
log.msg(
"Item wrote to MongoDB database %s/%s"
%
(settings[
'MONGODB_DB'
], settings[
'MONGODB_COLLECTION'
]),
level
=
log.DEBUG, spider
=
spider)
return
item
|
可以看到其基本的处理流程是一样,但是MySQL不太方便的一点就是需要将数组类型的数据通过分隔符转换。而MongoDB支持存入List、Dict等多种类型的数据.
配置文件 。
在运行爬虫之前还需要将在 settings.py 中增加一些配置信息.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
BOT_NAME
=
'doubanmoive'
SPIDER_MODULES
=
[
'doubanmoive.spiders'
]
NEWSPIDER_MODULE
=
'doubanmoive.spiders'
ITEM_PIPELINES
=
{
'doubanmoive.mongo_pipelines.MongoDBPipeline'
:
300
,
'doubanmoive.pipelines.DoubanmoivePipeline'
:
400
,
}
LOG_LEVEL
=
'DEBUG'
DOWNLOAD_DELAY
=
2
RANDOMIZE_DOWNLOAD_DELAY
=
True
USER_AGENT
=
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5'
COOKIES_ENABLED
=
True
MONGODB_SERVER
=
'localhost'
MONGODB_PORT
=
27017
MONGODB_DB
=
'python'
MONGODB_COLLECTION
=
'test'
|
ITEM_PIPELINES 中定义了MySQL和MongoDB两个Pipeline文件,后面的数字代表执行的优先级顺序,范围为0~1000。 而中间的 DOWNLOAD_DELAY 等信息是为了防止爬虫被豆瓣Ban掉,增加了一些随机延迟,浏览器代理等。最后的就是MongoDB的配置信息,MySQL也可以参考这种方式来写.
至此为止,抓取豆瓣电影的爬虫就已经完成了。在命令行中执行 Scrapy crawl doubanmoive 让蜘蛛开始爬行吧! 。
最后此篇关于实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250的文章就讲到这里了,如果你想了解更多关于实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在一个网站上工作。 我需要了解我的网站是否获得了来自 Google 或任何其他搜索引擎的抓取工具/机器人的访问 在我的应用程序中,我正在拦截 http 请求。并且需要查明爬虫/机器人是否正在发出 h
我与北京理工大学python爬虫的邂逅 在人生的旅途中,我们时常有机会邂逅一些惊艳的事物,它们仿佛一束亮光照亮了前行的道路。而我,一个平凡的人类,也不例外。回想起那个让我心动的时刻,我想起了与北京理工
从“爬虫”谈起 在这个信息爆炸的时代,互联网上的数据宛如茫茫星海,琳琅满目。但是,我们能否想象到这些数据背后隐藏着多少珍贵的信息呢?有人说,要想获得这些数据,我们需要借助一种神奇的力量——爬虫。 什么
探索未知的领域 曾几何时,我陷入了对互联网世界的好奇之中。作为一个普通的人类,我对于计算机技术的了解可谓是一窍不通。然而,好奇心驱使着我踏上了学习的征途。 奇妙的爬虫 在探索计算机领域的过程中,我翻阅
教室的奇妙之旅 在一个晴朗的早晨,我来到了一所神奇且富有魅力的教室。这里充满了未知的冒险和无限的学习可能。嘿,你没听错,就是那个零基础Python视频教程课程的教室!让我带你一起踏上这趟令人期待的爬虫
零基础学python3 爬虫 嗨,各位小伙伴们!今天要和大家分享一段有关学习Python3爬虫的故事。无论是技术小白还是编程高手,都可以从中获益良多。 1. 邂逅神奇的爬虫世界 就像是迷失在未知之地的
我正在开发一个 Python(3) 程序,在该程序中,我必须使用输入作为表示各种操作的多次迭代列表来返回目录迭代的移动次数,例如: ../ 表示移动到当前文件夹的父文件夹。 ./ 保留在同一文件夹中
我和Python:一段关于爬虫和第三方库的故事 曾经有一个人,他和一门编程语言结下了不解之缘。这门语言就是Python,一个灵活而强大的工具,让他的世界变得多姿多彩。 遇见爬虫:探索未知的世界 某天,
偷心技艺:大众点评TOP10 爬虫 Python 故事发生在一个被互联网包围的城市,充满了各种各样的餐馆、咖啡厅和美食街巷。每天都有无数的食客们纠结于选择哪家餐厅才能获得满足和享受。就在这个时候,我偶
登山寻宝:为什么Python爬虫部分网页源码 人生就像登山寻宝的旅程,充满了未知和挑战。而对于爱好编程的我来说,写一个Python爬虫,探索网络世界也是一种刺激的冒险。今天,我想和大家分享一下为什么要
插班生的悲喜交加 记得那个夏天,我踏入了编程的殿堂,成为了一名程序员。对于一个毫无基础的人来说,这是一次勇敢而激动的尝试。然而,更令我兴奋的是,在我的码农之旅中,我发现了一种神奇的力量——Python
一、 意外的宝藏 当我踏进了编程的大门,发现了那个绚丽多彩的世界时,我仿佛捡到了一个意外的宝藏。在编码的世界里,我像是一个魔术师,用着神奇的符号与逻辑来创造奇迹。然而,随着时间的推移,我渐渐找到了一种
“呜呜呜~” 夏日的阳光穿过微风,洒在我身上,仿佛一片温暖而宁静的海洋。我望着眼前充满希望与挑战的屏幕,满脸的期待和困惑。作为一个刚刚入门的编程初学者,我竭尽全力探索着那座神秘的编程世界,好像是航行在
我的编程之旅 嗨,大家好!我是一个普通的人类,对于编程世界充满着无限的好奇和热情。今天,我想向大家讲述一段关于我的编程经历,特别是在爬虫领域的探索之旅。 1. 踏上未知的征途 就像一只踏上大海的小船,
揭秘神奇的爬虫世界:探寻京东销量数据库 从古至今,人类一直渴望了解世界的各个角落。而对于互联网这个充满未知和神秘的领域来说,我们更是怀着好奇和充满冒险精神的心态去探索。今天,我将带领大家踏上一段激动人
啊!你好呀!很高兴能遇到你,让我向你讲一个关于python爬虫爬取关键词排名的故事。 章节一:奇妙的网络世界 网络就像一片浩瀚的海洋,里面有无数宝藏等待着我们发掘。而当我们学会了使用python这把钥
一次意外的奇遇 在我们生活的世界中,技术如今已经无处不在,无论是大型软件开发还是个人应用,都离不开它的支持。而其中最为神奇的领域之一,就是爬虫技术。想象一下,你有可能仅凭几行代码,就能够在电脑屏幕上将
奇遇之旅 在这个大千世界中,我有幸踏上了一次令人兴奋的冒险之旅。故事的开始,是一个寂静而神秘的夜晚。 迷宫的入口 深夜的城市,街道上弥漫着微弱的灯光,仿佛点缀着无数的星星。我沿着曲径通幽的小巷走着,脚
python 爬虫 自动上传下载 从前有一个热爱编程的小伙子,他喜欢利用自己的技术解决各种实际问题。有一天,他面对一个任务:需要在网络上批量上传和下载文件。这可不是一件轻松的工作,但对于这位小伙子来说
一场奇妙的探险之旅:Python编程语言中的爬虫第三方库 故事从一个寻宝者开始。他身穿一件斑驳的皮衣,手持一柄锈迹斑斑的剑,如同一个当代版的荒野游侠。这位勇士的目标是探索Python编程语言中的神秘领
我是一名优秀的程序员,十分优秀!