python爬虫从0到1(三)

scrapy介绍和豆瓣实战

Scrapy 使用了 Twisted异步网络库来处理网络通讯的爬虫框架

scrapy的架构如上图,如需深入了解可以百度,这里不做详述

1、创建scrapy项目

      cmd环境中执行以下脚本,安装scrapy依赖

      pip install scrapy

      scrapy依赖安装完成后、开始创建scrapy项目的脚本,这里我以豆瓣为例

scrapy startproject douban
cd douban
scrapy genspider douban movie.douban.com

以上命令执行完后,可以看到项目的目录结构

scrapy项目目录结构
DoubanSpider
  ├── DoubanSpider			--项目的 Python 模块,程序将从此处导入 Python 代码。
  │   ├── __init__.py
  │   ├── items.py			--用于定义项目用到的 Item 类
  │   ├── middlewares.py
  │   ├── pipelines.py			--项目的管道文件它负责处理爬取到的信息该文件需要由开发者编写
  │   ├── __pycache__
  │   ├── settings.py			--项目的配置文件,在该文件中进行项目相关配置
  │   └── spiders				--在该目录下存放项目所需的蜘蛛,蜘蛛负责抓取项目感兴趣的信息
  │       ├── __init__.py
  │       └── __pycache__
  └── scrapy.cfg			--项目的总配置文件,通常无须修改。

      项目创建完成后,使用pycharm开发工具导入工程。导入后需要配置项目的python环境

#spiders下的douban.py是scrapy自动为我们生成的

class DoubanSpider(scrapy.Spider):
    name = 'douban'
    allowed_domains = ['movie.douban.com']
    start_urls = ['douban.com]

    def parse(self, response):
        pass

这里我们以https://movie.douban.com/top250  豆瓣电影Top250为例,爬取电影数据,存储到json文件中,具体写法不多说了  直接上代码

class DoubanSpider(scrapy.Spider):
    name = 'demo'
    allowed_domains = ['movie.douban.com']
    start_urls = ['http://movie.douban.com/top250']

    def parse(self, response):
        # html = response.text
        # reg = r'<img data-original="(.*?)">.*?<div class="li_txt">.*?<h3>(.*?)</h3>.*?<h4>(.*?)</h4>.*?<p>(.*?)</p>'
        # 获取每一个info的对象
        infos = response.xpath('//div[@class="item"]')
        for info in infos:
            # print(info.xpath('//div[@class="bd"]/p/text()'))
            item = DoubanItem()
            item['url'] = info.css('a::attr(href)').extract_first()
            item['img'] = info.css('img::attr(src)').extract_first()
            title = info.xpath('//span[@class="title"]/text()').extract()
            item['title'] = title[0]
            item['english_title'] = title[1]
            item['other'] = info.xpath('//span[@class="other"]/text()').extract_first()
            movie_info = info.xpath('//div[@class="bd"]').re('<p class>(.*)<br>(.*)</p>')
            item['info'] = movie_info[0].strip()
            item['area'] = movie_info[1].strip()
            item['rating_num'] = info.xpath('//span[@class="rating_num"]/text()').extract_first()
            item['comment'] = info.xpath('//span/text()').re_first('(.*)人评价')
            # item['comment'] = info.re_first('<span>(.*?)人评价</span>')
            item['inq'] = info.xpath('//span[@class="inq"]/text()').extract_first()
            # 这里是用的yield 而不是return
            yield item
class ScrapydemoPipeline(object):

# 初始化的操作,这里我们做本地化直接写成文件,所以初始化文件对象
def __init__(self):
print('实例化DemoPipeline')
self.f = open('movie_pipeline.json', 'w', encoding='utf-8')



def process_item(self, item, spider):
# content = json.dumps(dict(item))
# self.f.write(content + ",")
content = ''
content += '[地址]:' + item['url']
content += '\n'
content += '[海报]:' + item['img']
content += '\n'
content += '[标题]:' + item['title']
content += '\n'
content += '[英文标题]:' + item['english_title']
content += '\n'
content += '[其他]:' + item['other']
content += '\n'
content += '[详情]:' + item['info']
content += '\n'
content += '[地区]:' + item['area']
content += '\n'
content += '[评分]:' + item['rating_num']
content += '\n'
content += '[评论人数]:' + item['comment']
content += '\n'
content += '[评语]:' + item['inq']
content += '\n'
content += '================'
content += '\n'
self.f.write(content + ",")
# print(content)
return item

# def get_media_requests(self, item, info):
# yield Request(item['img'])

# 结束后做的操作,在这里我们要关闭文件
def close_spider(self, spider):
print('结束')
self.f.close()

在执行spider之前,需要需改settings.py中的配置

ROBOTSTXT_OBEY:是否遵循机器人协议,默认是true,需要改为false,否则很多东西爬不了

ROBOTSTXT_OBEY = False

执行完后看下结果文件,会产生数据

至此,豆瓣数据获取完成!

python
爬虫

关于作者

loyal
获得点赞
文章被阅读