scrapy爬虫学习笔记

文章目录

    • 一、scrapy框架环境配置
    • 二、创建一个项目
    • 三、创建一个Spider

一、scrapy框架环境配置

1、安装并配置anaconda环境
2、配置anaconda环境的镜像:

conda config --add channels 镜像地址
conda config --set show_channel_urls yes

执行命令之后会在c:\users\username\下生成一个.condaarc文件,可以使用编辑器直接修改
3、安装scrapy

conda install scrapy

二、创建一个项目

1、创建一个scrapy项目

scrapy startproject helloworld

2、项目结构如下:
scrapy爬虫学习笔记_第1张图片
scrapy.cfg:部署配置文件
helloworld:项目的python模块,从此处导入你的代码
items.py:数据项定义
middlewares.py:定义下载器中间件和蜘蛛中间件的位置
piplines.py:定义Item Pipline,实现数据的清洗、储存、验证
settings.py:全局配置
spiders:用于放置爬虫的目录

3、创建一个spider
打开一个终端,将当前目录切换到spiders下,然后执行命令

scrapy genspider demo maoyan.com

scrapy会创建一个py文件,内容如下

# -*- coding: utf-8 -*-
import scrapy


class DemoSpider(scrapy.Spider):
    name = 'demo'  # 项目的名字
    allowed_domains = ['maoyan.com']  # 允许爬取的域名
    start_urls = ['http://maoyan.com/']  # 爬取的网站,可以定义多个初始的url

	# 请求初始url之后执行的方法,主要用于对网页的解析与获取想要的数据
	# response 请求网页后返回的内容
    def parse(self, response):
        pass

4、定义items
item是保存爬取数据的容器,定义方式和字典类似

import scrapy


class HelloworldItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    index = scrapy.Field()
    title = scrapy.Field()
    star = scrapy.Field()
    release_time = scrapy.Field()
    score = scrapy.Field()

5、实现parse方法

# -*- coding: utf-8 -*-
import scrapy
from helloworld.items import HelloworldItem


class DemoSpider(scrapy.Spider):
    name = 'demo'
    allowed_domains = ['maoyan.com']
    start_urls = ['http://maoyan.com/']

    def parse(self, response):
        dl = response.css(':board-wrapper dd')
        for dd in dl:
            item = HelloworldItem()
            item.index = dd.css('.board-index::text').extract_first()
            item.title = dd.css('.name a::text').extract_first()
            item.star = dd.css('.star::text').extract_first()
            item.release_time = dd.css('.releasetime::text').extract_first()
            item.score = dd.css('integer::text').extract_first()+dd.css('.fraction::text').extract_first()
            yield item

6、运行
将目录切换到scrapy.cfg所在目录下,并执行以下命令

scrapy crawl demo

三、创建一个Spider

1、在spiders路径下创建一个py文件qutoes_spider.py,定义一个Spider如下

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"  # 唯一标识爬虫

    # 返回爬虫开始爬取的url
    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)  # yield关键字与python的生成器有关,生成器中的元素只能被遍历一次

    # 处理每个请求得到的响应,通常用于处理响应、将爬取的数据抽取为字典或json、检索并添加新的请求
    def parse(self, response):
        page = response.url.split('/')[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)  # 将响应存储为文件
        self.log('Saved file %s' % filename)

运行过程:Scrapy逐个发出request请求,一旦收到响应就立即创建一个Response对象,并执行与对应请求绑定的函数,将Response对象作为参数传入该函数(在本例中这个函数是parse)
对start_requests方法的简化:可以不定义这个方法,而是直接定义一个list类型的类属性

class QuotesSpider(scrapy.Spider):
	name = "quotes"
	start_urls = [
		'http://quotes.toscrape.com/page/1/',
        'http://quotes.toscrape.com/page/2/',
	]
	...

提取数据:提取数据的最好方法是使用scrapy shell

scrapy shell "http://quotes.toscrape.com/page/1/"

在shell中可以利用css和response对象选择各个节点。

response.css('title')  # 返回值是一个类似list的对象SelectorList,其中每一个元素的类型是Selector,封装着xml/html元素并允许继续进行细粒度的检索

你可能感兴趣的:(scrapy,爬虫)