scrapy基础

---恢复内容开始---

scrapy

Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

1.安装环境

MAC下:

pip install scrapy

Win系统下:

a. pip3 install wheel

b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

c. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl

d. pip3 install pywin32

e. pip3 install scrapy

2.执行流程

在terminal中输入指令:

创建一个工程:

scrapy startproject first_project

创建爬虫文件:

cd first_project  # 进入工程目录
scrapy genspider first www.xxx.com  # 创建爬虫文件

scrapy genspider 应用名称 爬取网页的起始url (例如:scrapy genspider qiubai www.xxx.com)

执行项目:

scrapy crawl first

scrapy crawl 爬虫名称 :该种执行形式会显示执行的日志信息
scrapy crawl 爬虫名称 --nolog:该种执行形式不会显示执行的日志信息

保存数据

scrapy crawl first -o items.json

生成的具体目录如下

基本配置与实现

1.爬虫文件first.py

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

class FirstSpider(scrapy.Spider):
    #爬虫文件的名称
    name = 'first'
#允许的域名,一般情况不写,因为爬取图片等资源时,常用到跨域,这样把域名限制后会出现问题 # allowed_domains = ['www.baidu.com']
#起始的url列表:列表中存放的url都会被scrapy进行自动的请求发送 start_urls = ['https://www.baidu.com/','https://www.sogou.com'] #解析数据,访问起始URL并获取结果后的回调函数,该函数的response参数就是向起始的url发送请求后,获取的响应对象.
   #该函数返回值必须为可迭代对象或者NUll
def parse(self, response): print(response.text) # 获取字节类型的响应内容
print(response.body) # 获取字节类型的相应内容

2.设置修改settings.py配置文件相关配置

# 设置user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'

# 忽略,不遵守Robots协议
ROBOTSTXT_OBEY = False

# 设置item类的优先级
ITEM_PIPELINES = {
    #300表示的是优先级(数值越小优先级越高)
   'firstBloof.pipelines.QiubaiproPipeline': 200,
   'firstBloof.pipelines.MysqlPipeLine': 301,
   'firstBloof.pipelines.RedisPipeLine': 401,
}

 # 日志类型:INFO DEBUG ERROR
 LOG_LEVEL = 'ERROR'

 数据的持久化存储

示例: 爬取糗百首页中段子的内容和标题

# -*- coding: utf-8 -*-
import scrapy
from qiubaiPro.items import QiubaiproItem

class QiubaiSpider(scrapy.Spider):
    name = 'qiubai'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['https://www.qiushibaike.com/text/']

    #终端指令的持久化存储:只可以将parse方法的返回值存储到磁盘文件
    # def parse(self, response):
    #     div_list = response.xpath('//div[@id="content-left"]/div')
    #     all_data = []
    #     for div in div_list:
    #         # author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
    #         author = div.xpath('./div[1]/a[2]/h2/text()').extract_first()
    #         content = div.xpath('./a/div/span//text()').extract()
    #         content = ''.join(content)
    #
    #         dic = {
    #             'author':author,
    #             'content':content
    #         }
    #
    #         all_data.append(dic)
    #
    #     return all_data
    #基于管道的持久化存储
    def parse(self, response):
        div_list = response.xpath('//div[@id="content-left"]/div')
        all_data = []
        for div in div_list:
            # author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
            author = div.xpath('./div[1]/a[2]/h2/text()').extract_first()
            content = div.xpath('./a/div/span//text()').extract()
            content = ''.join(content)
            #实例化一个item类型的对象
            item = QiubaiproItem()
            #使用中括号的形式访问item对象中的属性
            item['author'] = author
            item['content'] = content

            #将item提交给管道
            yield item

 

posted @ 2019-05-31 16:02  robertx  阅读(295)  评论(0编辑  收藏  举报