iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python scrapy学习笔记
  • 470
分享到

python scrapy学习笔记

学习笔记pythonscrapy 2023-01-31 07:01:08 470人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

scrapy是python最有名的爬虫框架之一,可以很方便的进行WEB抓取,并且提供了很强的定制型。一、安装scrapy# pip install scrapy二、基本使用1、初始化scrapy项目# scrapy startproject

scrapypython最有名的爬虫框架之一,可以很方便的进行WEB抓取,并且提供了很强的定制型。


一、安装scrapy

# pip install scrapy


二、基本使用

1、初始化scrapy项目

# scrapy startproject myscrapy


初始化完成后的目录结构

# tree
.
├── myscrapy
│   ├── __init__.py
│   ├── items.py                      # 设置数据存储模板,用于结构化数据
│   ├── middlewares.py                # 中间件,相当于钩子,对爬去前后做预处理
│   ├── pipelines.py                  # 管道模块,处理spider模块分析好的数据,如保存入库等
│   ├── settings.py                   # 配置文件,如并发数,是否开启缓存
│   └── spiders
│       ├── __init__.py
│       └── myspider.py
└── scrapy.cfg                         # 项目的配置文件


一个例子爬取当当网的首页

#!/usr/bin/Python
#coding:utf-8

import scrapy

class DangDang(scrapy.Spider):
    # 必须定义
    name = "dangdang"
    # 初始urls
    start_urls = [ 
        "Http://www.dangdang.com"
    ]   

    # 默认response处理函数
    def parse(self, response):      # 抓取start_urls页面,自动执行parse回调函数
        current_url = response.url  # 当前请求的URL
        body = response.body        # 请求的内容
        print '请求的URL: {}\n请求的内容: {}'.fORMat(current_url,body)


运行

# scrapy crawl dangdang                # 方式1
# scrapy runspider dangdang.py         # 方式2


爬虫开始爬取start_urls定义的url,并输出到文件中,最后输出爬去报告,会输出爬取得统计结果


2、通过代码运行爬虫

每次进入控制台运行爬虫还是比较麻烦的,而且不好调试,我们可以通过CrawlerProcess通过代码运行爬虫,新建一个模块run.py

#!/usr/bin/python
#coding:utf-8

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from spiders.dangdang import DangDang

# 获取setting.py模块的设置
settings = get_project_settings()
process = CrawlerProcess(settings=settings)

# 添加spider,可以多个
process.crawl(DangDang)                                                                                                                                       

# 启动爬虫,阻塞知道爬取结束
process.start()

只需要执行python run.py就可以执行爬虫


三、Scrapy类

如上面的DangDang类,爬虫类继承自scrapy.Spider


1、常用属性

  • name:爬虫的名字,必须唯一(如果在控制台使用的话,必须配置)

  • start_urls:爬虫初始爬取的链接列表

  • parse:response结果处理函数

  • custom_settings:自定义配置,覆盖settings.py中的默认配置


2、常用方法

  • start_requests:启动爬虫的时候调用,默认是调用make_requests_from_url方法爬取start_urls的链接,可以在这个方法里面定制,如果重写了该方法,start_urls默认将不会被使用,可以在这个方法里面定制一些自定义的url,如登录,从数据库读取url等,本方法返回Request对象

  • make_requests_from_url:默认由start_requests调用,可以配置Request对象,返回Request对象

  • parse:response到达spider的时候默认调用,如果在Request对象配置了callback函数,则不会调用,parse方法可以迭代返回ItemRequest对象,如果返回Request对象,则会进行增量爬取


3、Request与Response对象

  每个请求都是一个Request对象,Request对象定义了请求的相关信息(url, method, headers, body, cookie, priority)和回调的相关信息(meta, callback, dont_filter, errback),通常由spider迭代返回

  其中meta相当于附加变量,可以在请求完成后通过response.meta访问请求完成后,会通过Response对象发送给spider处理,常用属性有(url, status, headers, body, request, meta)



四、选择器

  • 基本的选择器

  • 正则选择


1、基本的选择器

  1. //                    ## 子孙

  2. /                     # 孩子

  3. //div[@class='info'][@id='1']  # 属性选择器

  4. //div/img/@src            # div下所有img的src值

  5. //div/a[1]               # div下第一个<a>

  6. //div/a[1]/text()          # div下第一个<a>的值


例如

wKioL1hiEMqhmYZ8AABFcjnhrYU527.jpg

想要获取书名,可以写为: //ul[@class='list_aa listimg']/li//a/@title


查找方式

# 方法1,即将被废弃的
from scrapy.selector import htmlXPathSelector
hxs = HtmlXPathSelector(response)
items_HtmlXPathSelector = hxs.select('//ul[@class='list_aa listimg']/li//a/@title')
print(len(items_HtmlXPathSelector))

# 方法2
from scrapy.selector import Selector
items_Selector = Selector(response=response).xpath('//ul[@class='list_aa listimg']/li//a/@title')
print(len(items_Selector))


2、正则选择器

<body>
    <li class="item-"><a href="link.html">first item</a></li>
    <li class="item-0"><a href="link1.html">first item</a></li>
    <li class="item-1"><a href="link2.html">second item</a></li>
</body>


书写方法://li[re:test(@class, "item-\d*")]//@href

查找方式

ret = Selector(response=response).xpath('//li[re:test(@class, "item-\d*")]//@href').extract()
# re ---- 通过正则进行匹配
# test -- 匹配


五、使用scrapy爬取网站聊天记录和用户头像

#!/usr/bin/python
#coding:utf-8

import scrapy
from scrapy.selector import Selector
import os
import requests

class NextSpider(scrapy.spiders.Spider):
    name = 'nextspider'
    start_urls = ["http://group.jobbole.com/27740/#comm-77724"]

    def parse(self,response):
        items_selector = Selector(response=response)
        items = items_selector.xpath('//ul[@class="cmnt-list"]/li')
#       print items
        for i in range(len(items)):
            srcs = items_selector.xpath('//ul[@class="cmnt-list"]/li[%d]//div[@class="cmnt-header"]/a/img/@src'%i).extract()
            names = items_selector.xpath('//ul[@class="cmnt-list"]/li[%d]//div[@class="cmnt-header"]/div/span[1]/a/text()'%i).extract()
            msgs = items_selector.xpath('//ul[@class="cmnt-list"]/li[%d]//div[@class="cmnt-body"]/p/text()'%i).extract()                                      
            if srcs and names and msgs:
                try:
                    img_url = srcs[0]
                    filename = names[0].encode('utf-8')
                    msg = ','.join([i.encode('utf-8') for i in msgs[1:]])
                    print '用户ID: {}\n发表信息: {}'.format(filename,msg)
                    img_dir = 'imgs'
                    path = os.path.join(os.getcwd(),img_dir,filename+'.png')
                    r = requests.get(img_url)
                    with open(path,'wb') as f:
                        for chunk in r.iter_content(chunk_size=1024):
                            if chunk:
                                f.write(chunk)
                                f.flush()
                        f.close()
                except Exception,e:
                    print '错误: {}'.format(e)


结果

用户ID: 小编辑
发表信息: 恭喜!,说说你是怎么追到的。然后再打广告 :)
用户ID: 迷路的兔纸-->
发表信息: 你这是赤果果的炫耀
用户ID: sorry丶
发表信息: 10月份去九寨沟,在青旅里面遇到我的那个她。
... ...


图片

# ls imgs/
lishenluo.png  sorry丶.png  寻找隐世快乐.png  小编辑.png  忠文.png  熊绎.png  连时光都吐了.png  迷路的兔纸-->.png


六、items.py中的Item类

初始化后默认的Item类

import scrapy

class MyscrapyItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass


scrapy.Item的用法与python中的字典用法基本一样,只是做了一些安全限制,属性定义使用Field,这里只是进行了声明,而不是真正的属性,使用的时候通过键值对操作,不支持属性访问


七、Pipeline

spider负责爬虫的配置,item负责声明结构化数据,而对于数据的处理,在scrapy中使用管道的方式进行处理,只要注册过的管道都可以处理item数据(处理,过滤,保存)


示例:这里定义一个预处理管道PretreatmentPipeline.py,如果item的title为None,则设置为空字符串

class PretreatmentPipeline(object):
    def process_item(self, item, spider):
        if item['msgs']:
            # 不让msgs为空
            item['msgs'] = ''
        return item


八、setting.py文件

setting.py文件中为我们提供了许多自带的功能,例如缓存、多线程等等,只需要修改配置即可

1、缓存

# 打开缓存
HTTPCACHE_ENABLED = True

# 设置缓存过期时间(单位:秒)
#HTTPCACHE_EXPIRATION_SECS = 0

# 缓存路径(默认为:.scrapy/httpcache)
HTTPCACHE_DIR = 'httpcache'

# 忽略的状态码
HTTPCACHE_IGNORE_HTTP_CODES = []

# 缓存模式(文件缓存)
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'


2、多线程

# 默认Request并发数:32
CONCURRENT_REQUESTS = 32

# 默认每个域名的并发数:16
CONCURRENT_REQUESTS_PER_DOMaiN = 16

# 每个IP的最大并发数:0表示忽略
CONCURRENT_REQUESTS_PER_IP = 16


--结束END--

本文标题: python scrapy学习笔记

本文链接: https://www.lsjlt.com/news/190879.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python scrapy学习笔记
    scrapy是python最有名的爬虫框架之一,可以很方便的进行web抓取,并且提供了很强的定制型。一、安装scrapy# pip install scrapy二、基本使用1、初始化scrapy项目# scrapy startproject...
    99+
    2023-01-31
    学习笔记 python scrapy
  • python scrapy学习笔记(二)
    使用scrapy批量抓取,参考http://python.jobbole.com/87155一、创建项目# scrapy startproject comics创建完成后的目录结构. ├── comics │   ├── __init__....
    99+
    2023-01-31
    学习笔记 python scrapy
  • Python学习笔记
    Python介绍 Python是一种解释型、面向对象的语言。 官网:www.python.org Python环境 解释器:www.python.org/downloads 运行方式: 交互模式。在IDLE中运行。 脚本模式。文件的后缀...
    99+
    2023-01-30
    学习笔记 Python
  • Python 学习笔记
    rs=Person.objects.all() all返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据。 print rs.query 会打印出原生sql语句 rs=Pe...
    99+
    2023-01-31
    学习笔记 Python
  • python学习笔记--趣学Python
    由反弹球和球拍构成的游戏。球会在屏幕上飞过来,玩家要用球拍把它弹回去 画布和画弹球 引入模块 #Tkinter -- Python的标准GUI库,Tk 接口,是python 内置的安装包 from tkinter import * i...
    99+
    2023-01-31
    学习笔记 python Python
  • Python Paste 学习笔记
    一、写在前面 这篇文章主要介绍了Python的Paste库的使用,学习过程中主要参考官网文档以及自己的理解,整理成笔记以便后续自己查阅。 如果转载,请保留作者信息。 邮箱地址:jpzhang.ht@gmail.com ...
    99+
    2023-01-31
    学习笔记 Python Paste
  • python OpenCV学习笔记
    目录图像翻转图像轮廓排序图像轮廓排序颜色识别基础颜色识别根据BGR获取HSV阈值编辑器图像翻转 使用Python的一个包,imutils。使用下面的指令可以安装。 pip in...
    99+
    2024-04-02
  • Python学习笔记(1)
    Python开发框架:       a.Python基础;       b.网络编程;       c.WEB框架;       d.设计模式+算法;       e.项目阶段; 开发:   开发语言:       高级语言:Python...
    99+
    2023-01-30
    学习笔记 Python
  • Python学习笔记(二)
    学完了基础中的基础后,我们准备深入基础中的函数、类和对象。 function函数: 正如英文单词描述的,函数就是“功能”的意思,把完成一个功能所需要的代码打包起来放在一个函数下可以方便以后程序的重复调用,也能使整体代码条理清晰。正如前...
    99+
    2023-01-30
    学习笔记 Python
  • python-memcached学习笔记
    介绍:   memcached是免费、开源、高性能、分布式内存对象的缓存系统(键/值字典),旨在通过减轻数据库负载加快动态web应用程序的使用。   数据类型:只用一种字符串类型 1:安装 sudo apt-get install me...
    99+
    2023-01-31
    学习笔记 python memcached
  • python egg学习笔记
    原文链接:http://www.worldhello.net/2010/12/08/2178.html经常接触Python的同学可能会注意到,当需要安装第三方python包时,可能会用到easy_install命令。easy_instal...
    99+
    2023-01-31
    学习笔记 python egg
  • Python学习笔记 --- pprin
    使用 pprint 模块 pprint 模块( pretty printer ) 用于打印 Python 数据结构. 当你在命令行下打印特定数据结构时你会发现它很有用(输出格式比较整齐, 便于阅读). import pprin...
    99+
    2023-01-31
    学习笔记 Python pprin
  • python学习笔记(1
    关于随笔 python随笔只是个人笔记,可能会有遗漏或错误,仅供参考 学习文档地址 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e5...
    99+
    2023-01-30
    学习笔记 python
  • Python 学习笔记 - socket
    前面学习的例子都是单线程的socket收发;如果有多个用户同时接入,那么除了第一个连入的,后面的都会处于挂起等待的状态,直到当前连接的客户端断开为止。通过使用socketserver,我们可以实现并发的连接。socketserver的使用很...
    99+
    2023-01-31
    学习笔记 Python socket
  • Python 学习笔记 - SQLAlc
    继续上一篇SQLAlchemy的学习之旅。多对多表的创建表Host和表HostUser通过表HostToHostUser关联在一起from sqlalchemy import create_engine from sqlalchemy.ex...
    99+
    2023-01-31
    学习笔记 Python SQLAlc
  • Python学习笔记(2)
    Unicode字符串: GB2312编码为表示中文产生 python内部编码是unicode编码Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填0 就可以以Unicode表示的字...
    99+
    2023-01-31
    学习笔记 Python
  • Python 学习笔记 - Memcac
    Memcached是一个分布式内存对象缓存系统,他把数据缓存在内存里面来减少对数据库的访问,从而提高动态网页的访问速度。他的基本结构是key/value(键值对)。下面看看在Python里面如何使用。首先来安装一下服务器端,豆子直接在一个C...
    99+
    2023-01-31
    学习笔记 Python Memcac
  • python学习笔记 --- prin
    print 输出直接到文件里主要是python版本问题,语法不一样,这里记录一下。 python 3.x #!/usr/bin/env python3 #coding:utf-8 K = 10 f = open("./output/r...
    99+
    2023-01-31
    学习笔记 python prin
  • Python学习笔记-SQLSERVER
    环境 : python3.6 / win10 / vs2017 / sqlserver2017 一、需要安装的包pymssql pip install pymssql 二、pymssql模块的介绍 pymssql 包 有modules...
    99+
    2023-01-30
    学习笔记 Python SQLSERVER
  • Python学习笔记(1)
    1 def sum_args(*args): 2 return sum(args)) 3 4 def run_with_positional_args(func, *args): 5 return func(*...
    99+
    2023-01-31
    学习笔记 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作