用Scrapy爬虫下载图片(豆瓣电影图片)
用Scrapy爬虫的安装和入门教程,这里有,这篇链接的博客也是我这篇博客的基础。
其实我完全可以直接在上面那篇博客中的代码中直接加入我要下载图片的部分代码的,但是由于上述博客中的代码已运行,已爬到快九千的电影详情数据,不忍重新爬一次,所以爬豆瓣电影图片的爬虫重新写一遍。
前言:我的需求是根据已有电影名在豆瓣中搜索电影,然后获得电影的链接,继续爬虫,获得电影的图片。
上述链接的博客的需求我在这里也顺带列一下,不关心的直接忽略之:我要爬的是豆瓣的数据,我有了很多电影的名字,但是我需要电影的详情,我用了一下豆瓣电影的网站,发现当我在搜索框里输入“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文件中。
电影图片下载核心:
其中urllib.urlretrieve就是核心,到这里读者应该就知道怎么下载图片了(参考文章:http://www.tuicool.com/articles/7JVvaa),而且可以命名为我们自己想要的名字。关于urllib的urlretrieve方法的详细解释见这里,当然,也可以去看python官方文档。
还有一种办法来处理图片下载:Scrapy的ImagesPipeline,这里有篇教程。
没兴趣的就不要继续往下面阅读了,以免浪费大家的时间。下面记录的是我爬图片的所有代码。
————————————————————————————————————————————————————————————————————
1、item文件:
- #coding=utf-8
- # Define here the models for your scraped items
- #
- # See documentation in:
- # http://doc.scrapy.org/topics/items.html
- from scrapy.item import Item, Field
- class TutorialItem(Item):
- # define the fields for your item here like:
- # name = Field()
- #movie_detail = Field()
- movie_id = Field()
- movie_picture = Field()
items.py
2、pilelines文件:
- # Define your item pipelines here
- #
- # Don't forget to add your pipeline to the ITEM_PIPELINES setting
- # See: http://doc.scrapy.org/topics/item-pipeline.html
- import json
- import codecs
- class TutorialPipeline(object):
- def __init__(self):
- self.file = codecs.open('pic.dat',mode='a+',encoding='utf-8')
- def process_item(self, item, spider):
- line = json.dumps(dict(item)) + '\n'
- self.file.write(line.decode("unicode_escape"))
- return item
pipelines.py
【mode='a+'】表明我对存储图片url的文件的读写是以追加的方式写的。
3、spiders文件:
- #coding=utf-8
- import sys
- reload(sys)
- #python默认环境编码时ascii
- sys.setdefaultencoding("utf-8")
- from scrapy.spider import BaseSpider
- from scrapy.http import Request
- from scrapy.selector import HtmlXPathSelector
- from tutorial.items import TutorialItem
- import re
- import urllib
- class DoubanSpider(BaseSpider):
- name = "douban"
- allowed_domains = ["movie.douban.com"]
- start_urls = []
- def start_requests(self):
- file_object = open('movie_name.txt','r')
- try:
- url_head = "http://movie.douban.com/subject_search?search_text="
- for line in file_object:
- self.start_urls.append(url_head + line)
- for url in self.start_urls:
- yield self.make_requests_from_url(url)
- finally:
- file_object.close()
- #years_object.close()
- def parse(self, response):
- #open("test.html",'wb').write(response.body)
- hxs = HtmlXPathSelector(response)
- movie_link = hxs.select('//*[@id="content"]/div/div[1]/div[2]/table[1]/tr/td[1]/a/@href').extract()
- if movie_link:
- yield Request(movie_link[0],callback=self.parse_item)
- def parse_item(self,response):
- hxs = HtmlXPathSelector(response)
- movie_picture = hxs.select('//*[@id="mainpic"]/a/img/@src').extract()
- item = TutorialItem()
- item['movie_picture'] = ''.join(movie_picture).strip()
- #用来给爬到的图片命令的,这个文件里只有一行数据,因为我会在我的main.py文件中调用scrapy爬虫,会在main.py中不断更新这个文件
- movie_id_file = open('movie_id.txt','r')
- try:
- for line in movie_id_file:
- item['movie_id'] = line.strip()
- if movie_picture:
- urllib.urlretrieve(movie_picture[0].strip(),'pictures\\' + line.strip() + '.jpg')
- finally:
- movie_id_file.close()
- yield item
douban_spider.py
4、main文件:这个文件是用来控制Scrapy来爬虫的
- #coding=utf-8
- import sys
- reload(sys)
- #python默认环境编码时ascii
- sys.setdefaultencoding("utf-8")
- import os
- #os.system(r"scrapy crawl douban")
- #读取电影数据
- movies_info = open('movies.sql','r')
- try:
- for line in movies_info:
- #将每条电影数据里面的需要的数据提取出来
- movie_infos = line.split(',',4)
- movie_id = movie_infos[1]
- movie_title = movie_infos[2]
- #print movie_id + ":" + movie_title
- write_name = movie_title.replace('_','+')
- write_name = write_name.replace('\'','')
- #print "name is :" + write_name
- #把电影名写到中间文件中去,让爬虫读取
- movie_name_file = open('movie_name.txt','w')
- try:
- movie_name_file.write(write_name)
- finally:
- movie_name_file.close()
- #把电影id写到中间文件中去,让爬虫读取
- movie_id_file = open('movie_id.txt','w')
- try:
- movie_id_file.write(movie_id)
- finally:
- movie_id_file.close()
- #该爬虫程序会从movie_name中读取电影名来爬虫
- os.system(r"scrapy crawl douban")
- finally:
- movies_info.close()
main.py
main.py读取的movies.sql的格式我截图一下:
上述的moive_name是用来在豆瓣中进行电影搜索的,moive_id是给图片来命名的,我把这两个东西分别写到了两个不同的文件中,供spider来读取。
在douban_spider.py中对上述两个文件进行读:
然后在DOS中切换到tutorial目录下输入python main.py就可以爬啦……
好了,可以爬取图片了,给大家看看结果:
写写博客记录自己实践过程,也希望对需要者有用。
用Scrapy爬虫下载图片(豆瓣电影图片)的更多相关文章
- scrapy爬虫学习系列五:图片的抓取和下载
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- 第一个nodejs爬虫:爬取豆瓣电影图片
第一个nodejs爬虫:爬取豆瓣电影图片存入本地: 首先在命令行下 npm install request cheerio express -save; 代码: var http = require( ...
- Python爬虫----抓取豆瓣电影Top250
有了上次利用python爬虫抓取糗事百科的经验,这次自己动手写了个爬虫抓取豆瓣电影Top250的简要信息. 1.观察url 首先观察一下网址的结构 http://movie.douban.com/to ...
- 转:Scrapy安装、爬虫入门教程、爬虫实例(豆瓣电影爬虫)
Scrapy在window上的安装教程见下面的链接:Scrapy安装教程 上述安装教程已实践,可行.(本来打算在ubuntu上安装Scrapy的,但是Ubuntu 磁盘空间太少了,还没扩展磁盘空间,所 ...
- Scrapy安装、爬虫入门教程、爬虫实例(豆瓣电影爬虫)
Scrapy在window上的安装教程见下面的链接:Scrapy安装教程 上述安装教程已实践,可行.(本来打算在ubuntu上安装Scrapy的,但是Ubuntu 磁盘空间太少了,还没扩展磁盘空间,所 ...
- python爬虫 Scrapy2-- 爬取豆瓣电影TOP250
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- Python爬虫爬取豆瓣电影之数据提取值xpath和lxml模块
工具:Python 3.6.5.PyCharm开发工具.Windows 10 操作系统.谷歌浏览器 目的:爬取豆瓣电影排行榜中电影的title.链接地址.图片.评价人数.评分等 网址:https:// ...
- Scrapy-redis分布式爬虫爬取豆瓣电影详情页
平时爬虫一般都使用Scrapy框架,通常都是在一台机器上跑,爬取速度也不能达到预期效果,数据量小,而且很容易就会被封禁IP或者账号,这时候可以使用代理IP或者登录方式爬,然而代理IP很多时候都很鸡肋, ...
- python3 爬虫---爬取豆瓣电影TOP250
第一次爬取的网站就是豆瓣电影 Top 250,网址是:https://movie.douban.com/top250?start=0&filter= 分析网址'?'符号后的参数,第一个参数's ...
随机推荐
- Java AES加密
Java AES 加密 加密 /** * * @description 加密 * * @param content 需要加密的内容 * @param password 加密密码 * @return * ...
- memcached简介(转)
背景 memcached是一个高性能.分布式的内存对象缓存系统. memcached广泛应用在大负载高并发的网站上,是一种非常成熟的产品(称为一项技术也未尝不可).像facebook,yout ...
- iphone dev 入门实例7:How to Add Splash Screen in Your iOS App
http://www.appcoda.com/how-to-add-splash-screen-in-your-ios-app/ What’s Splash Screen? For those who ...
- NYOJ16 矩形嵌套(DAG最长路)
矩形嵌套 紫书P262 这是有向无环图DAG(Directed Acyclic Graph)上的动态规划,是DAG最长路问题 [题目链接]NYOJ16-矩形嵌套 [题目类型]DAG上的dp & ...
- set_union的几个例子
获得两个集合的并集.两个输入序列须保证已排好序. 数组用的时候 // set_union example #include <iostream> #include <algorith ...
- windows上传文件到linux
1.在putty的网站上下载putty跟pscp 2.安装ssh跟putty sudo apt-get install openssh-server sudo apt-get install putt ...
- JavaScript判断字符串是否含有中文(实用)
引用页: http://javasam.iteye.com/blog/1465048 UTF-8有点类似于Haffman编码,它将Unicode编码为:0x00-0x7F的字符,用单个字节来表示:0x ...
- struts (三)
1. <action name="test" class="com.gc.Test"> <result name="success& ...
- gc 辅助打印信息
cat xx.xml|grep GC <jvm-arg>-XX:+PrintGCDetails</jvm-arg> <jvm-arg>-XX:+PrintGCDat ...
- echart 图表 在.net中生成图片的方法
经过中午近两个小时的努力,终于可以实现了:echart 图表 在.net中生成图片 以下源代码: 前台页面: <!DOCTYPE html><html><head> ...