Scrapy安装、爬虫入门教程、爬虫实例(豆瓣电影爬虫)

Scrapy在window上的安装教程见下面的链接:Scrapy安装教程

上述安装教程已实践,可行。本来打算在ubuntu上安装Scrapy的,但是Ubuntu 磁盘空间太少了,还没扩展磁盘空间,暂时不想再上面装太多软件。

Scrapy的入门教程见下面链接:Scrapy入门教程

上面的入门教程是很基础的,先跟着作者走一遍,要动起来哟,不要只是阅读上面的那篇入门教程,下面我简单总结一下Scrapy爬虫过程:

1、在Item中定义自己要抓取的数据

movie_name就像是字典中的“键”,爬到的数据就像似字典中的“值”。在继承了BaseSpider的类中会用到:

第一行就是上面那个图中的TutorialItem这个类,红框圈出来的就是上图中的movie_name这个变量

2、然后在spiders目录下编辑Spider.py那个文件

按上面【入门教程】来写就行了,我这边给个例子,跟我上面的item是匹配的:

【入门教程】你没有给出start_requests这个方法,稍后我会讲到这个方法。另外这里的代码我都是截图,后面我会用代码面板显示我的代码,有需要的人可以复制下来玩玩。

3、编辑pipelines.py文件,可以通过它将保存在TutorialItem中的内容写入到数据库或者文件中

下面的代码示例是写到文件(如果要写到数据库中去,这里有个示例代码)中去:

对json模块的方法的注释:dump和dumps(从Python生成JSON),load和loads(解析JSON成Python的数据类型);dump和dumps的唯一区别是dump会生成一个类文件对象,dumps会生成字符串,同理load和loads分别解析类文件对象和字符串格式的JSON。(注释来于http://www.jb51.net/article/52224.htm )

4、爬虫开始

上述三个过程后就可以爬虫了,仅需上述三个过程哟,然后在dos中将目录切换到tutorial下输入scrapy crawl douban就可以爬啦:

上面几个过程只是先理清楚用Scrapy爬虫的思路,下面的重点戏是第二个过程,我会对这个过程进行较详细的解释,并提供代码。

douban_spider.py这个文件的代码如下:

  1 #coding=utf-8
  2 import sys
  3 reload(sys)
  4 #python默认环境编码时ascii
  5 sys.setdefaultencoding("utf-8")
  6 from scrapy.spider import BaseSpider
  7 from scrapy.http import Request
  8 from scrapy.selector import HtmlXPathSelector
  9 from tutorial.items import TutorialItem
 10 import re
 11
 12 class DoubanSpider(BaseSpider):
 13     name = "douban"
 14     allowed_domains = ["movie.douban.com"]
 15     start_urls = []
 16
 17     def start_requests(self):
 18         file_object = open(‘movie_name.txt‘,‘r‘)
 19
 20         try:
 21             url_head = "http://movie.douban.com/subject_search?search_text="
 22             for line in file_object:
 23                 self.start_urls.append(url_head + line)
 24
 25             for url in self.start_urls:
 26                 yield self.make_requests_from_url(url)
 27         finally:
 28             file_object.close()
 29             #years_object.close()
 30
 31     def parse(self, response):
 32         #open("test.html",‘wb‘).write(response.body)
 33         hxs = HtmlXPathSelector(response)
 34         #movie_name = hxs.select(‘//*[@id="content"]/div/div[1]/div[2]/table[1]/tr/td[1]/a/@title‘).extract()
 35         movie_link = hxs.select(‘//*[@id="content"]/div/div[1]/div[2]/table[1]/tr/td[1]/a/@href‘).extract()
 36         #movie_desc = hxs.select(‘//*[@id="content"]/div/div[1]/div[2]/table[1]/tr/td[2]/div/p/text()‘).extract()
 37
 38         if movie_link:
 39             yield Request(movie_link[0],callback=self.parse_item)
 40
 41
 42     def parse_item(self,response):
 43         hxs = HtmlXPathSelector(response)
 44         movie_name = hxs.select(‘//*[@id="content"]/h1/span[1]/text()‘).extract()
 45         movie_director = hxs.select(‘//*[@id="info"]/span[1]/span[2]/a/text()‘).extract()
 46         movie_writer = hxs.select(‘//*[@id="info"]/span[2]/span[2]/a/text()‘).extract()
 47         #爬取电影详情需要在已有对象中继续爬取
 48         movie_description_paths = hxs.select(‘//*[@id="link-report"]‘)
 49         movie_description = []
 50         for movie_description_path in movie_description_paths:
 51             movie_description = movie_description_path.select(‘.//*[@property="v:summary"]/text()‘).extract()
 52
 53         #提取演员需要从已有的xPath对象中继续爬我要的内容
 54         movie_roles_paths = hxs.select(‘//*[@id="info"]/span[3]/span[2]‘)
 55         movie_roles = []
 56         for movie_roles_path in movie_roles_paths:
 57             movie_roles = movie_roles_path.select(‘.//*[@rel="v:starring"]/text()‘).extract()
 58
 59         #获取电影详细信息序列
 60         movie_detail = hxs.select(‘//*[@id="info"]‘).extract()
 61
 62         item = TutorialItem()
 63         item[‘movie_name‘] = ‘‘.join(movie_name).strip().replace(‘,‘,‘;‘).replace(‘\‘‘,‘\\\‘‘).replace(‘\"‘,‘\\\"‘).replace(‘:‘,‘;‘)
 64         #item[‘movie_link‘] = movie_link[0]
 65         item[‘movie_director‘] = movie_director[0].strip().replace(‘,‘,‘;‘).replace(‘\‘‘,‘\\\‘‘).replace(‘\"‘,‘\\\"‘).replace(‘:‘,‘;‘) if len(movie_director) > 0 else ‘‘
 66         #由于逗号是拿来分割电影所有信息的,所以需要处理逗号;引号也要处理,否则插入数据库会有问题
 67         item[‘movie_description‘] = movie_description[0].strip().replace(‘,‘,‘;‘).replace(‘\‘‘,‘\\\‘‘).replace(‘\"‘,‘\\\"‘).replace(‘:‘,‘;‘) if len(movie_description) > 0 else ‘‘
 68         item[‘movie_writer‘] = ‘;‘.join(movie_writer).strip().replace(‘,‘,‘;‘).replace(‘\‘‘,‘\\\‘‘).replace(‘\"‘,‘\\\"‘).replace(‘:‘,‘;‘)
 69         item[‘movie_roles‘] = ‘;‘.join(movie_roles).strip().replace(‘,‘,‘;‘).replace(‘\‘‘,‘\\\‘‘).replace(‘\"‘,‘\\\"‘).replace(‘:‘,‘;‘)
 70         #item[‘movie_language‘] = movie_language[0].strip() if len(movie_language) > 0 else ‘‘
 71         #item[‘movie_date‘] = ‘‘.join(movie_date).strip()
 72         #item[‘movie_long‘] = ‘‘.join(movie_long).strip()
 73
 74         #电影详情信息字符串
 75         movie_detail_str = ‘‘.join(movie_detail).strip()
 76         #print movie_detail_str
 77
 78         movie_language_str = ".*语言:</span> (.+?)<br><span.*".decode("utf8")
 79         movie_date_str = ".*上映日期:</span> <span property=\"v:initialReleaseDate\" content=\"(\S+?)\">(\S+?)</span>.*".decode("utf8")
 80         movie_long_str = ".*片长:</span> <span property=\"v:runtime\" content=\"(\d+).*".decode("utf8")
 81
 82         pattern_language =re.compile(movie_language_str,re.S)
 83         pattern_date = re.compile(movie_date_str,re.S)
 84         pattern_long = re.compile(movie_long_str,re.S)
 85
 86
 87         movie_language = re.search(pattern_language,movie_detail_str)
 88         movie_date = re.search(pattern_date,movie_detail_str)
 89         movie_long = re.search(pattern_long,movie_detail_str)
 90
 91         item[‘movie_language‘] = ""
 92         if movie_language:
 93             item[‘movie_language‘] = movie_language.group(1).strip().replace(‘,‘,‘;‘).replace(‘\‘‘,‘\\\‘‘).replace(‘\"‘,‘\\\"‘).replace(‘:‘,‘;‘)
 94         #item[‘movie_detail‘] = ‘‘.join(movie_detail).strip()
 95
 96         item[‘movie_date‘] = ""
 97         if movie_date:
 98             item[‘movie_date‘] = movie_date.group(1).strip().replace(‘,‘,‘;‘).replace(‘\‘‘,‘\\\‘‘).replace(‘\"‘,‘\\\"‘).replace(‘:‘,‘;‘)
 99
100         item[‘movie_long‘] = ""
101         if movie_long:
102             item[‘movie_long‘] = movie_long.group(1)
103
104         yield item

douban_spider.py

代码有了,我来一步步讲解哈。

前言:我要爬的是豆瓣的数据,我有了很多电影的名字,但是我需要电影的详情,我用了一下豆瓣电影的网站,发现当我在搜索框里输入“Last Days in Vietnam”时url会变成http://movie.douban.com/subject_search?search_text=Last+Days+in+Vietnam&cat=1002 然后我就试着直接输入http://movie.douban.com/subject_search?search_text=Last+Days+in+Vietnam这个url,搜索结果是一样的,很显然这就是get方式,这样我们就找到了规律:http://movie.douban.com/subject_search?search_text=后面加上我们的电影名字并用加号分割就行了。

我们的电影名字(大量的电影名字)是存在某个文件movie_name.txt里面的(一行一个电影名字):

我们可以先用python脚本(shell脚本也行)将电影名之间的空格处理为+,也可以在爬虫中读取电影名后进行一次replace处理(我是先处理成+的)。爬虫读取电影名字文件,然后构建url,然后就根据得到的网页找到搜索到的第一个电影的url(其实第一个电影未必一定是我们要的,但是这种情况是少数,我们暂时不理会它),得到第一个电影的url后,再继续爬,这次爬到的页面就含有我们想要的电影信息,需要使用XPath来获得html文件中元素节点,最后将获得的信息存到TutorialItem中,通过pipelines写入到data.dat文件中

XPath的教程在这里:w3school的基础教程scrapy官网上的Xpath 这些东西【入门教程】中都有说。

1、start_requests方法:

在【入门教程】那篇文章中没有用到这个方法,而是直接在start_urls中存入我们要爬虫的网页链接,但是如果我们要爬虫的链接很多,而且是有一定规律的,我们就需要重写这个方法了,首先我们看看start_requests这个方法是干嘛的:

可见它就是从start_urls中读取链接,然后使用make_requests_from_url生成Request,

start_requests官方解释在这里

那么这就意味我们可以在start_requests方法中根据我们自己的需求往start_urls中写入我们自定义的规律的链接:

2、parse方法:

生成了请求后,scrapy会帮我们处理Request请求,然后获得请求的url的网站的响应response,parse就可以用来处理response的内容。在我们继承的类中重写parse方法:

parse_item是我们自定义的方法,用来处理新连接的request后获得的response:

递归爬虫的方法这里这里有。

HtmlXPathSelector的解释在这里

为了获得我想要的数据我也是蛮拼的,由于豆瓣电影详情的节点是没太大规律了,我后面还用了正则表达式去获取我要的内容,具体看上面的代码中parse_item这个方法吧:

好了,结束了,这里还有一篇Scrapy的提高篇,有兴趣的去看看吧。

写写博客是为了记录一下自己实践的过程,也希望能对需要者有用吧!

时间: 2024-10-20 07:41:54

Scrapy安装、爬虫入门教程、爬虫实例(豆瓣电影爬虫)的相关文章

爬虫入门-4-3.爬取豆瓣电影

1 import requests 2 3 url = "https://movie.douban.com/cinema/nowplaying/changsha/" 4 proxy = { 5 'HTTP': '116.209.53.143:9999' 6 } 7 headers = { 8 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' 9 ' (KHTML, like Geck

Python爬虫入门教程:博客园首页推荐博客排行的秘密

1. 前言 虽然博客园注册已经有五年多了,但是最近才正式开始在这里写博客.(进了博客园才知道这里面个个都是人才,说话又好听,超喜欢这里...)但是由于写的内容都是软件测试相关,热度一直不是很高.看到首页的推荐博客排行时,心里痒痒的,想想看看这些大佬究竟是写了什么文章这么受欢迎,可以被推荐.所以用Python抓取了这100位推荐博客,简单分析了每个博客的文章分类,阅读排行榜,评论排行榜及推荐排行榜,最后统计汇总并生成词云.正好这也算是一篇非常好的Python爬虫入门教程了. 2. 环境准备 2.1

爬虫入门实战,知乎小爬虫

相比于爬虫框架,知乎小爬虫,更加适合初学者,尤其是想要了解爬虫技术细节.实现自己编写爬虫需求的初学者. 1. 谈爬虫工程师的价值 大数据时代已到,数据越来越具有价值了,没有数据寸步难行,有了数据好好利用,可以在诸多领域干很多事,比如很火的互联网金融.从互联网上爬来自己想要的数据,是数据的一个重要来源,而且往往是必不可少的来源.所有,目前,爬虫工程师是一个非常吃香的职位,工资往往都不低,就是要耐得住寂寞了.那爬虫工程师的价值也就是能稳定的.高效的和实时的带来数据.这里推荐看两篇文章: http:/

Java豆瓣电影爬虫——抓取电影详情和电影短评数据

一直想做个这样的爬虫:定制自己的种子,爬取想要的数据,做点力所能及的小分析.正好,这段时间宝宝出生,一边陪宝宝和宝妈,一边把自己做的这个豆瓣电影爬虫的数据采集部分跑起来.现在做一个概要的介绍和演示. 动机 采集豆瓣电影数据包括电影详情页数据和电影的短评数据. 电影详情页如下图所示 需要保存这些详情字段如导演.编剧.演员等还有图中右下方的标签. 短评页面如下图所示 需要保存的字段有短评所属的电影名称,每条评论的详细信息如评论人名称.评论内容等. 数据库设计 有了如上的需求,需要设计表,其实很简单,

python豆瓣电影爬虫

python豆瓣电影爬虫 可以爬取豆瓣电影信息,能够将电影信息存进mysql数据库,还能够下载电影预告片.2.3. 4功能使用到selenium库 一个例程运行截图 下载好的电影预告片 MySQL存储的数据 数据表构造 这是程序流程图,详细写明了本爬虫的运行流程 爬虫程序代码 # Author:YFAN import random import requests import lxml.etree from time import sleep import re import pymysql f

最详细的Python爬虫入门教程,一篇文章入门爬虫不是儿戏!

0×00 介绍 0×01 要求 0×02 你能学到什么? 0×03 知识补充 0×04 最简单的开始 0×05 更优雅的解决方案 0×06 url合法性判断 0×07 总结与预告 0×00 介绍 学习Python中有不明白推荐加入交流群 号:548377875 群里有志同道合的小伙伴,互帮互助, 群里有不错的学习教程! 爬虫技术是数据挖掘,测试技术的重要的组成部分,是搜索引擎技术的核心. 但是作为一项普通的技术,普通人同样可以用爬虫技术做很多很多的事情,比如:你想了解一下某网所有关于爬虫技术的文

Scrapy 豆瓣电影爬虫

本篇主要介绍通过scrapy 框架来豆瓣电影 下面我简单总结一下Scrapy爬虫过程: 1.在Item中定义自己要抓取的数据: 2.编辑在spiders目录下DoubanSpider文件 3.编辑pipelines.py文件,可以通过它将保存在MoveScrapyPipeline中的内容写入到数据库或者文件中

python爬虫入门(5)----- 阿里巴巴供应商爬虫

阿里巴巴供应商爬虫 起因 学了爬虫入门之后,打算找一个有难度的网站来实践,一开始打算找淘宝或者天猫(业界老大)来实践,但后续发现网上已经有很多这方面的项目,于是瞄上了阿里的国际网站阿里巴巴.开始一切顺利,没发现什么难度,后面发现供应商的联系方式需要登录,于是以其为目标开始写爬虫. 网站结构 1.阿里巴巴有个供应商分类的页面 https://www.alibaba.com/companies 2.点进去之后有个二级分类 3.再点进去就可以找到这个分类下的所有供应商 4.再进去就可以找供应商的联系方

Elasticsearch安装和入门教程(转)

说明:转自老阮的文章,业界最简单的入门教程. 作者: 阮一峰 日期: 2017年8月17日 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选. 它可以快速地储存.搜索和分析海量数据.维基百科.Stack Overflow.Github 都采用它. Elastic 的底层是开源库 Lucene.但是,你没法直接用 Lucene,必须自己写代码去调用它的接口.Elastic 是 Lucene 的封装,提供了 REST API 的操作接