尚硅谷python爬虫(五)-scrapy

一、scrapy简介

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

二、scrapy项目的创建及运行

1.创建scrapy项目

终端输入 scrapy startproject 项目名称

2.项目组成

spiders
__init__.py
自定义的爬虫文件.py ‐‐‐》由我们自己创建,是实现爬虫核心功能的文件
__init__.py
items.py ‐‐‐》定义数据结构的地方,是一个继承自scrapy.Item的类
middlewares.py ‐‐‐》中间件 代理
pipelines.py ‐‐‐》管道文件,里面只有一个类,用于处理下载数据的后续处理
默认是300优先级,值越小优先级越高(1‐1000)
settings.py ‐‐‐》配置文件 比如:是否遵守robots协议,User‐Agent定义等

3.创建爬虫文件

(1)跳转到spiders文件夹 cd 目录名字/目录名字/spiders
(2)scrapy genspider 爬虫名字 待爬取的网页的域名
  • 爬虫文件的基本组成:
    • 继承scrapy.Spider类
    • name = 'baidu' ‐‐‐》 运行爬虫文件时使用的名字
    • allowed_domains ‐‐‐》 爬虫允许的域名,在爬取的时候,如果不是此域名之下的url,会被过滤掉
    • start_urls ‐‐‐》 声明了爬虫的起始地址,可以写多个url,一般是一个
    • parse(self, response) ‐‐‐》解析数据的回调函数
    • response.text ‐‐‐》响应的是字符串
    • response.body ‐‐‐》响应的是二进制文件
    • response.xpath()‐》xpath方法的返回值类型是selector列表
    • extract() ‐‐‐》提取的是selector对象的是data
    • extract_first() ‐‐‐》提取的是selector列表中的第一个数据

4.运行爬虫文件

scrapy crawl 爬虫名称
注意:应在spiders文件夹内执行

三、58同城项目

1. scrapy项目的结构
    项目名字
        项目名字
            spiders文件夹 (存储的是爬虫文件)
                init
                自定义的爬虫文件    核心功能文件  ****************
            init
            items        定义数据结构的地方 爬取的数据都包含哪些
            middleware   中间件    代理
            pipelines    管道   用来处理下载的数据
            settings     配置文件    robots协议  ua定义等

2. response的属性和方法
    response.text   获取的是响应的字符串
    response.body   获取的是二进制数据
    response.xpath  可以直接是xpath方法来解析response中的内容
    response.extract()   提取seletor对象的data属性值
    response.extract_first() 提取的seletor列表的第一个数据
import scrapy


class TcSpider(scrapy.Spider):
    name = 'tc'
    allowed_domains = ['https://bj.58.com/sou/?key=%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91']
    start_urls = ['https://bj.58.com/sou/?key=%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91']

    def parse(self, response):
        # 字符串
        # content = response.text
        # 二进制数据
        # content = response.body
        # print('===========================')
        # print(content)

        span = response.xpath('//div[@id="filter"]/div[@class="tabs"]/a/span')[0]
        print('=======================')
        print(span.extract())

四、汽车之家项目

  • scrapy工作原理

import scrapy

class CarSpider(scrapy.Spider):
    name = 'car'
    allowed_domains = ['https://car.autohome.com.cn/price/brand-15.html']
    # 注意如果你的请求的接口是html为结尾的  那么是不需要加/的
    start_urls = ['https://car.autohome.com.cn/price/brand-15.html']

    def parse(self, response):
        name_list = response.xpath('//div[@class="main-title"]/a/text()')
        price_list = response.xpath('//div[@class="main-lever"]//span/span/text()')

        for i in range(len(name_list)):
            name = name_list[i].extract()
            price = price_list[i].extract()
            print(name,price)

五、scrapy shell

  • Scrapy终端,是一个交互终端,供您在未启动spider的情况下尝试及调试您的爬取代码。 其本意是用来测试提取 数据的代码,不过您可以将其作为正常的Python终端,在上面测试任何的Python代码。 该终端是用来测试XPath或CSS表达式,查看他们的工作方式及从爬取的网页中提取的数据。 在编写您的spider时,该 终端提供了交互性测试您的表达式代码的功能,免去了每次修改后运行spider的麻烦。 一旦熟悉了Scrapy终端后,您会发现其在开发和调试spider时发挥的巨大作用。
应用:
(1)scrapy shell www.baidu.com
(2)scrapy shell http://www.baidu.com
 (3) scrapy shell "http://www.baidu.com"
 (4) scrapy shell "www.baidu.com"
语法:
(1)response对象:
response.body
response.text
response.url
response.status
(2)response的解析:
response.xpath() (常用)
使用xpath路径查询特定元素,返回一个selector列表对象
response.css()
使用css_selector查询元素,返回一个selector列表对象
获取内容 :response.css('#su::text').extract_first()
获取属性 :response.css('#su::attr(“value”)').extract_first()
(3)selector对象(通过xpath方法调用返回的是seletor列表)
extract()
提取selector对象的值
如果提取不到值 那么会报错
使用xpath请求到的对象是一个selector对象,需要进一步使用extract()方法拆
包,转换为unicode字符串
extract_first()
提取seletor列表中的第一个值
如果提取不到值 会返回一个空值
返回第一个解析到的值,如果列表为空,此种方法也不会报错,会返回一个空值
xpath()
css()
注意:每一个selector对象可以再次的去使用xpath或者css方法

 六、当当网爬取

1.通过items.py设置下载数据的内容结构

2.通过dang.py定义爬取数据对象(包含:图片下载地址,名称,价格)

3.通过yield函数将对象book提交给管道pipelines.py(注意在settings中开启管道下载),完成管道封装

4.设置多条管道下载

5.多页数据下载

具体代码见本地...

七、crapy crawspider

1.crawspider继承自scrapy.Spider

2.独门秘笈

  • CrawlSpider可以定义规则,再解析html内容的时候,可以根据链接规则提取出指定的链接,然后再向这些链接发 送请求 所以,如果有需要跟进链接的需求,意思就是爬取了网页之后,需要提取链接再次爬取,使用CrawlSpider是非常合适的

3.提取链接 链接提取器,在这里就可以写规则提取指定链接

  • scrapy.linkextractors.LinkExtractor( allow = (), # 正则表达式 提取符合正则的链接
  • deny = (), # (不用)正则表达式 不提取符合正则的链接
  • allow_domains = (), # (不用)允许的域名
  • deny_domains = (), # (不用)不允许的域名
  • restrict_xpaths = (), # xpath,提取符合xpath规则的链接
  • restrict_css = () # 提取符合选择器规则的链接)

4.模拟使用

  • 正则用法:links1 = LinkExtractor(allow=r'list_23_\d+\.html')
  • xpath用法:links2 = LinkExtractor(restrict_xpaths=r'//div[@class="x"]')
  • css用法:links3 = LinkExtractor(restrict_css='.x')

5.提取连接

  • link.extract_links(response)

6.注意事项

  • callback只能写函数名字符串, callback='parse_item'
  • 在基本的spider中,如果重新发送请求,那里的callback写的是 callback=self.parse_item 【注‐ ‐稍后看】follow=true 是否跟进 就是按照提取连接规则进行提取

 7.crawspider案例

读书网数据爬取
1.创建项目:scrapy startproject dushuproject
2.跳转到spiders路径 cd\dushuproject\dushuproject\spiders
3.创建爬虫类:scrapy genspider ‐t crawl read www.dushu.com
4.items
5.spiders
6.settings
7.pipelines
数据保存到本地
数据保存到mysql数据库

数据入库

(1)settings配置参数:
DB_HOST = '192.168.231.128'
DB_PORT = 3306
DB_USER = 'root'
DB_PASSWORD = '1234'
DB_NAME = 'test'
DB_CHARSET = 'utf8'
(2)管道配置
from scrapy.utils.project import get_project_settings
import pymysql
class MysqlPipeline(object):
    #__init__方法和open_spider的作用是一样的
    #init是获取settings中的连接参数
    def __init__(self):
        settings = get_project_settings()
        self.host = settings['DB_HOST']
        self.port = settings['DB_PORT']
        self.user = settings['DB_USER']
        self.pwd = settings['DB_PWD']
        self.name = settings['DB_NAME']
        self.charset = settings['DB_CHARSET']
        self.connect()
# 连接数据库并且获取cursor对象
    def connect(self):
        self.conn = pymysql.connect(host=self.host,
        port=self.port,
        user=self.user,
        password=self.pwd,
        db=self.name,
        charset=self.charset)
        self.cursor = self.conn.cursor()
        def process_item(self, item, spider):
            sql = 'insert into book(image_url, book_name, author, info) values("%s",
            "%s", "%s", "%s")' % (item['image_url'], item['book_name'], item['author'],                             item['info'])
            sql = 'insert into book(image_url,book_name,author,info) values
            ("{}","{}","{}","{}")'.format(item['image_url'], item['book_name'],             item['author'],
            item['info'])
    # 执行sql语句
            self.cursor.execute(sql)
            self.conn.commit()
    return item
    def close_spider(self, spider):
        self.conn.close()
        self.cursor.close()

八、日志信息和日志等级

  • 日志级别:
    • CRITICAL:严重错误
    • ERROR:一般错误
    • WARNING: 警告
    • INFO: 一般信息
    • DEBUG: 调试信息默认的日志等级是DEBUG
    • 只要出现了DEBUG或者DEBUG以上等级的日志那么这些日志将会打印
  • settings.py文件设置:
    • 默认的级别为DEBUG,会显示上面所有的信息
    • 在配置文件中 settings.py
    • LOG_FILE : 将屏幕显示的信息全部记录到文件中,屏幕不再显示,注意文件后缀一定是.log
    • LOG_LEVEL : 设置日志显示的等级,就是显示哪些,不显示哪些
  •  scrapy的post请求
    • (1)重写start_requests方法: def start_requests(self)
    • (2)start_requests的返回值: scrapy.FormRequest(url=url, headers=headers, callback=self.parse_item, formdata=data) url: 要发送的post地址 headers:可以定制头信息 callback: 回调函数 formdata: post所携带的数据,这是一个字典
  • 代理
    • (1)到settings.py中,打开一个选项 DOWNLOADER_MIDDLEWARES = { 'postproject.middlewares.Proxy': 543, }
    • (2)到middlewares.py中写代码 def process_request(self, request, spider): request.meta['proxy'] = 'https://113.68.202.10:9999' return None

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D_lullaby

你的支持是对我最大的鼓励!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值