来源:Scrapy安装、爬虫入门教程、爬虫实例(豆瓣电影爬虫)
该例子中未使用代理和模拟浏览器,所以会导致403Forbidden,以下已优化。
代码放在附件中。
采用settings.py的方式进行设置user agent和proxy列表
http://www.tuicool.com/articles/VRfQR3U
http://jinbitou.net/2016/12/01/2229.html (本文采用这种方式模拟浏览器和使用代理)
网站的反爬虫策略:
http://www.cnblogs.com/tyomcat/p/5447853.html
1、在Item中定义自己要抓取的数据(也可新建TutorialItem文件):
from scrapy.item import Item,Field class TutorialItem(Item): movie_name = Field() movie_director = Field() movie_writer = Field() movie_roles = Field() movie_language = Field() movie_date = Field() movie_long = Field() movie_description = Field()
2、然后在spiders目录下编辑Spider.py那个文件(自己新建了DoubanSpider.py文件)
注意数据的获取:
hxs = HtmlXPathSelector(response)
movie_link = hxs.select('//*[@id="content"]/div/div[1]/div[2]/table[1]/tr/td[1]/a/@href').extract()
#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 ScrapyTest1.TutorialItem import TutorialItem import re import os class DoubanSpider(BaseSpider): name = "douban" allowed_domains = ["movie.douban.com"] start_urls = [] def start_requests(self): print("=======================",os.getcwd()) file_object = open('F:\workspace-jxc\ScrapyTest1\ScrapyTest1\spiders\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_name = hxs.select('//*[@id="content"]/div/div[1]/div[2]/table[1]/tr/td[1]/a/@title').extract() movie_link = hxs.select('//*[@id="content"]/div/div[1]/div[2]/table[1]/tr/td[1]/a/@href').extract() #movie_desc = hxs.select('//*[@id="content"]/div/div[1]/div[2]/table[1]/tr/td[2]/div/p/text()').extract() print("+++++++++++++++++:",movie_link) if movie_link: yield Request(movie_link[0],callback=self.parse_item) def parse_item(self,response): hxs = HtmlXPathSelector(response) movie_name = hxs.select('//*[@id="content"]/h1/span[1]/text()').extract() movie_director = hxs.select('//*[@id="info"]/span[1]/span[2]/a/text()').extract() movie_writer = hxs.select('//*[@id="info"]/span[2]/span[2]/a/text()').extract() #爬取电影详情需要在已有对象中继续爬取 movie_description_paths = hxs.select('//*[@id="link-report"]') print("==============================") print(movie_name,movie_director,movie_writer) print("==============================") movie_description = [] for movie_description_path in movie_description_paths: movie_description = movie_description_path.select('.//*[@property="v:summary"]/text()').extract() #提取演员需要从已有的xPath对象中继续爬我要的内容 movie_roles_paths = hxs.select('//*[@id="info"]/span[3]/span[2]') movie_roles = [] for movie_roles_path in movie_roles_paths: movie_roles = movie_roles_path.select('.//*[@rel="v:starring"]/text()').extract() #获取电影详细信息序列 movie_detail = hxs.select('//*[@id="info"]').extract() item = TutorialItem() item['movie_name'] = ''.join(movie_name).strip().replace(',',';').replace('\'','\\\'').replace('\"','\\\"').replace(':',';') #item['movie_link'] = movie_link[0] item['movie_director'] = movie_director[0].strip().replace(',',';').replace('\'','\\\'').replace('\"','\\\"').replace(':',';') if len(movie_director) > 0 else '' #由于逗号是拿来分割电影所有信息的,所以需要处理逗号;引号也要处理,否则插入数据库会有问题 item['movie_description'] = movie_description[0].strip().replace(',',';').replace('\'','\\\'').replace('\"','\\\"').replace(':',';') if len(movie_description) > 0 else '' item['movie_writer'] = ';'.join(movie_writer).strip().replace(',',';').replace('\'','\\\'').replace('\"','\\\"').replace(':',';') item['movie_roles'] = ';'.join(movie_roles).strip().replace(',',';').replace('\'','\\\'').replace('\"','\\\"').replace(':',';') #item['movie_language'] = movie_language[0].strip() if len(movie_language) > 0 else '' #item['movie_date'] = ''.join(movie_date).strip() #item['movie_long'] = ''.join(movie_long).strip() #电影详情信息字符串 movie_detail_str = ''.join(movie_detail).strip() #print movie_detail_str movie_language_str = ".*语言:</span> (.+?)<br><span.*" movie_date_str = ".*上映日期:</span> <span property=\"v:initialReleaseDate\" content=\"(\S+?)\">(\S+?)</span>.*" movie_long_str = ".*片长:</span> <span property=\"v:runtime\" content=\"(\d+).*" pattern_language =re.compile(movie_language_str,re.S) pattern_date = re.compile(movie_date_str,re.S) pattern_long = re.compile(movie_long_str,re.S) movie_language = re.search(pattern_language,movie_detail_str) movie_date = re.search(pattern_date,movie_detail_str) movie_long = re.search(pattern_long,movie_detail_str) item['movie_language'] = "" if movie_language: item['movie_language'] = movie_language.group(1).strip().replace(',',';').replace('\'','\\\'').replace('\"','\\\"').replace(':',';') #item['movie_detail'] = ''.join(movie_detail).strip() item['movie_date'] = "" if movie_date: item['movie_date'] = movie_date.group(1).strip().replace(',',';').replace('\'','\\\'').replace('\"','\\\"').replace(':',';') item['movie_long'] = "" if movie_long: item['movie_long'] = movie_long.group(1) print("==============================222222222") print(item) print("==============================222222222") yield item
3、编辑pipelines.py文件,可以通过它将保存在TutorialItem中的内容写入到数据库或者文件中
(自己新建了TutorialPipeline.py文件)
注意新建的pipeline.py文件需要在settings.py中配置:
ITEM_PIPELINES = { 'ScrapyTest1.TutorialPipeline.TutorialPipeline': 1, }
import json import codecs class TutorialPipeline(object): def __init__(self): print("Pipeline-111111111111111111111") self.file = codecs.open('data.dat',mode='wb',encoding='utf-8') def process_item(self, item, spider): print("Pipeline-222222222222222222222") print("dict(item):=======================",dict(item)) line = json.dumps(dict(item)) + '\n' self.file.write(line) return item
4、爬虫开始
win-》CMD-》 scrapy crwal douban
执行爬虫。
相关推荐
在本课程设计中,我们将深入探讨如何利用Python爬虫技术来获取并分析豆瓣电影网站上的影评数据。Python爬虫是获取大量网络数据的有效手段,尤其适用于数据分析和挖掘项目。以下是一些关键知识点: 1. **Python基础*...
3. 爬虫实战:爬取豆瓣电影Top250 ## 高级篇 1. Selenium与PhantomJS的使用 2. 分布式爬虫的实现 3. 反反爬虫策略 4. 爬虫实战:爬取微博热搜榜 在学习过程中,我们将会提供大量的代码示例和实战项目,以帮助您更...
3. 爬虫实战:爬取豆瓣电影Top250 ## 高级篇 1. Selenium与PhantomJS的使用 2. 分布式爬虫的实现 3. 反反爬虫策略 4. 爬虫实战:爬取微博热搜榜 在学习过程中,我们将会提供大量的代码示例和实战项目,以帮助您更...
在本项目中,我们将探讨如何使用Python爬虫技术来抓取豆瓣电影Top250列表中的电影信息以及相关的用户评论。这是一个典型的Web数据抓取实战项目,涉及到的主要知识点包括Python编程、网络请求、HTML解析、数据存储...
* Scrapy 框架:Scrapy 框架是一套比较成熟的 Python 爬虫框架,是使用 Python 开发的快速、高层次的信息爬取框架,可以高效的爬取 web 页面并提取出结构化数据。 * Crawley 框架:Crawley 也是 Python 开发出的爬虫...
在本实习报告中,我们将深入探讨Python网络爬虫的基本概念、常用的爬虫框架及其特性,以及通过实例演示如何使用Python爬虫爬取豆瓣网上的电影数据。 一、爬虫选题背景 随着互联网信息的爆炸式增长,手动收集和处理...
"Python爬虫技术入门到高级第七章" 本章节主要讲述了爬虫技术的概述、网络协议和 HTTP 协议、...爬虫实战:爬虫实战是指使用爬虫技术爬取实际网站数据,例如爬取豆瓣电影排行榜、爬取天气数据、爬取新闻网站数据等。
1. Scrapy框架:Scrapy是一个功能丰富的爬虫框架,支持中间件、管道、调度器等机制,能处理复杂的爬取任务,同时提供异步I/O,提高爬取速度。它适用于大规模数据抓取和复杂数据处理。 2. Crawley框架:与Scrapy类似...
爬取电影天堂最新的电影数据 - xpath 爬取腾讯招聘的职位数据 - xpath 爬取中国天气网全国天气并生成饼状图 - bs4 爬取古诗词网的数据 - re 爬取糗事百科上的段子数据 - re 多线程爬虫 多线程爬取斗图吧的表情...
总的来说,这个项目涵盖了Python爬虫技术的运用、数据清洗、用户画像构建、NLP分析和数据可视化等多个重要环节,是一次综合性的数据分析实战。通过完成这个项目,你不仅能提升Python编程技能,还能深入了解网络数据...
1. Scrapy:Scrapy是一个功能强大的Python爬虫框架,提供了完整的爬取、解析、数据存储等功能,适用于大型项目的爬虫开发。 2. Crawley:相比Scrapy,Crawley更注重简化爬虫开发,让非程序员也能快速上手。 3. ...
1. Scrapy 框架:Scrapy 框架是一套比较成熟的 Python 爬虫框架,是使用 Python 开发的快速、高层次的信息爬取框架,可以高效的爬取 web 页面并提取出结构化数据。 2. Crawley 框架:Crawley 框架也是 Python 开发出...
通过本次实习,我们了解了网络爬虫的基本原理、发展历程以及常用框架的比较,并通过实战项目掌握了Python爬虫的实现过程。网络爬虫不仅是一项技术,更是一种信息获取和处理的能力。在未来的工作中,这种能力将帮助...
python_”表明这个项目是关于使用Python爬虫技术从豆瓣网站抓取数据,并将抓取到的数据整理成Excel表格的实践案例。关键词“top250”意味着爬取的是豆瓣电影评分最高的前250部影片的相关信息。而“爬虫excel”和...
Python网络爬虫实习报告主要涵盖了爬虫的基本概念、发展历程、分类以及常见的Python爬虫框架,并通过实例演示了如何使用Python爬取豆瓣网上的电影数据。以下是对这些知识点的详细阐述: 一、爬虫原理 网络爬虫是一...
Python网络爬虫实习报告主要涵盖了网络爬虫的基本概念、历史、分类,以及常见的Python爬虫框架的比较,并通过实例展示了如何使用Python爬取豆瓣网的电影数据。以下是对这些知识点的详细阐述: 一、选题背景 网络...
10. **实战经验**:实践是检验理论的最好方式,通过实际爬取豆瓣电影和电视剧数据,可以深入了解网络爬虫的完整流程,从需求分析、设计、编码到测试。 在项目实施过程中,开发者可能需要面对各种挑战,如动态加载...
例如,使用Scrapy框架搭建高效稳定的爬虫系统,抓取豆瓣电影、猫眼电影等平台的数据,再结合数据分析工具,如matplotlib和seaborn进行可视化展示,可以揭示观众口味和市场表现。 综上所述,这些项目涵盖了爬虫在...
《豆瓣Python爬虫:探索与实践》 在Python的世界里,爬虫技术是开发者们获取网络数据的重要工具,尤其在数据分析、信息挖掘等领域扮演着关键角色。本资源以"豆瓣Python爬虫+源代码(适合爬虫学习)"为主题,为初学...