`
uule
  • 浏览: 6351465 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

Python爬虫实战:Scrapy豆瓣电影爬取

 
阅读更多

来源: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

执行爬虫。

 

 

 

 

  • 大小: 23.9 KB
  • 大小: 42.9 KB
分享到:
评论
1 楼 360pluse 2019-06-03  
技术更新,战术升级!Python爬虫案例实战从零开始一站通
网盘地址:https://pan.baidu.com/s/1b40tc0uI-UxySmZrpb0eXA 提取码: 65b7
备用地址(腾讯微云):https://share.weiyun.com/58aNzmx 密码:nz3prq

相关推荐

    基于python爬虫对豆瓣影评分析进行爬取的课程设计.zip

    在本课程设计中,我们将深入探讨如何利用Python爬虫技术来获取并分析豆瓣电影网站上的影评数据。Python爬虫是获取大量网络数据的有效手段,尤其适用于数据分析和挖掘项目。以下是一些关键知识点: 1. **Python基础*...

    python爬虫从入门到精通(模块)

    3. 爬虫实战:爬取豆瓣电影Top250 ## 高级篇 1. Selenium与PhantomJS的使用 2. 分布式爬虫的实现 3. 反反爬虫策略 4. 爬虫实战:爬取微博热搜榜 在学习过程中,我们将会提供大量的代码示例和实战项目,以帮助您更...

    python爬虫从入门到精通(模块)代码

    3. 爬虫实战:爬取豆瓣电影Top250 ## 高级篇 1. Selenium与PhantomJS的使用 2. 分布式爬虫的实现 3. 反反爬虫策略 4. 爬虫实战:爬取微博热搜榜 在学习过程中,我们将会提供大量的代码示例和实战项目,以帮助您更...

    python 爬虫 爬取豆瓣电影与影评

    在本项目中,我们将探讨如何使用Python爬虫技术来抓取豆瓣电影Top250列表中的电影信息以及相关的用户评论。这是一个典型的Web数据抓取实战项目,涉及到的主要知识点包括Python编程、网络请求、HTML解析、数据存储...

    Python网络爬虫实习报告材料

    * Scrapy 框架:Scrapy 框架是一套比较成熟的 Python 爬虫框架,是使用 Python 开发的快速、高层次的信息爬取框架,可以高效的爬取 web 页面并提取出结构化数据。 * Crawley 框架:Crawley 也是 Python 开发出的爬虫...

    Python网络爬虫实习报告.pdf

    在本实习报告中,我们将深入探讨Python网络爬虫的基本概念、常用的爬虫框架及其特性,以及通过实例演示如何使用Python爬虫爬取豆瓣网上的电影数据。 一、爬虫选题背景 随着互联网信息的爆炸式增长,手动收集和处理...

    Python爬虫技术入门到高级第七章

    "Python爬虫技术入门到高级第七章" 本章节主要讲述了爬虫技术的概述、网络协议和 HTTP 协议、...爬虫实战:爬虫实战是指使用爬虫技术爬取实际网站数据,例如爬取豆瓣电影排行榜、爬取天气数据、爬取新闻网站数据等。

    Python网络爬虫实习报告总结归纳.docx

    1. Scrapy框架:Scrapy是一个功能丰富的爬虫框架,支持中间件、管道、调度器等机制,能处理复杂的爬取任务,同时提供异步I/O,提高爬取速度。它适用于大规模数据抓取和复杂数据处理。 2. Crawley框架:与Scrapy类似...

    python爬虫项目实战

    爬取电影天堂最新的电影数据 - xpath 爬取腾讯招聘的职位数据 - xpath 爬取中国天气网全国天气并生成饼状图 - bs4 爬取古诗词网的数据 - re 爬取糗事百科上的段子数据 - re 多线程爬虫 多线程爬取斗图吧的表情...

    Python应用实战代码-Python爬取豆瓣影评-分析挖掘用户与电影之间的隐藏信息

    总的来说,这个项目涵盖了Python爬虫技术的运用、数据清洗、用户画像构建、NLP分析和数据可视化等多个重要环节,是一次综合性的数据分析实战。通过完成这个项目,你不仅能提升Python编程技能,还能深入了解网络数据...

    Python网络爬虫实习报告计划.pdf

    1. Scrapy:Scrapy是一个功能强大的Python爬虫框架,提供了完整的爬取、解析、数据存储等功能,适用于大型项目的爬虫开发。 2. Crawley:相比Scrapy,Crawley更注重简化爬虫开发,让非程序员也能快速上手。 3. ...

    Python网络爬虫实习报告材料.doc

    1. Scrapy 框架:Scrapy 框架是一套比较成熟的 Python 爬虫框架,是使用 Python 开发的快速、高层次的信息爬取框架,可以高效的爬取 web 页面并提取出结构化数据。 2. Crawley 框架:Crawley 框架也是 Python 开发出...

    Python网络爬虫实习报告.doc

    通过本次实习,我们了解了网络爬虫的基本原理、发展历程以及常用框架的比较,并通过实战项目掌握了Python爬虫的实现过程。网络爬虫不仅是一项技术,更是一种信息获取和处理的能力。在未来的工作中,这种能力将帮助...

    豆瓣_爬虫_爬虫excel_豆瓣;爬虫;top250;python_

    python_”表明这个项目是关于使用Python爬虫技术从豆瓣网站抓取数据,并将抓取到的数据整理成Excel表格的实践案例。关键词“top250”意味着爬取的是豆瓣电影评分最高的前250部影片的相关信息。而“爬虫excel”和...

    Python网络爬虫实习报告总结归纳.pdf

    Python网络爬虫实习报告主要涵盖了爬虫的基本概念、发展历程、分类以及常见的Python爬虫框架,并通过实例演示了如何使用Python爬取豆瓣网上的电影数据。以下是对这些知识点的详细阐述: 一、爬虫原理 网络爬虫是一...

    Python网络爬虫实习报告.docx

    Python网络爬虫实习报告主要涵盖了网络爬虫的基本概念、历史、分类,以及常见的Python爬虫框架的比较,并通过实例展示了如何使用Python爬取豆瓣网的电影数据。以下是对这些知识点的详细阐述: 一、选题背景 网络...

    豆瓣电影及电视剧影视剧信息爬取

    10. **实战经验**:实践是检验理论的最好方式,通过实际爬取豆瓣电影和电视剧数据,可以深入了解网络爬虫的完整流程,从需求分析、设计、编码到测试。 在项目实施过程中,开发者可能需要面对各种挑战,如动态加载...

    爬虫应用_爬虫_应用_中数爬取_

    例如,使用Scrapy框架搭建高效稳定的爬虫系统,抓取豆瓣电影、猫眼电影等平台的数据,再结合数据分析工具,如matplotlib和seaborn进行可视化展示,可以揭示观众口味和市场表现。 综上所述,这些项目涵盖了爬虫在...

    豆瓣python爬虫+源代码(适合爬虫学习)

    《豆瓣Python爬虫:探索与实践》 在Python的世界里,爬虫技术是开发者们获取网络数据的重要工具,尤其在数据分析、信息挖掘等领域扮演着关键角色。本资源以"豆瓣Python爬虫+源代码(适合爬虫学习)"为主题,为初学...

Global site tag (gtag.js) - Google Analytics