• 【Django中运行scrapy框架,并将数据存入数据库】


    【解决的问题】

    1、django和scrapy如何结合

    2、通过django启动scrapy爬虫

    此文仅介绍Django和scrapy的简单实现,适合想要快速上手的朋友。

    任务一、单独使用django框架创建web项目

    Django项目可以用命令创建,也可以用pycharm手动创建。此文用pycharm手动创建。

    1、使用pycharm创建Django项目:菜单栏File-->New project-->Django-->填写项目名称pro,app名称为app01-->create.

     此时项目的目录结构为如下,app01为项目pro的子应用。

     2、创建首页,首页内容为"这是一个测试页面"。

     3、运行程序,在浏览器中输入http://127.0.0.1:8000/index/。出现【这是一个测试页面!】则成功。

    demo下载:单独使用django框架创建web项目-Webpack文档类资源-CSDN下载单独使用django框架创建web项目更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/weixin_56516468/85745510

    任务二、单独使用scrapy实现简单爬虫

    一、准备工作

    scrapy安装:确保已经安装了scrapy,如未安装,则打开cmd,输入pip install scrapy.

    常用命令:

    1. scrapy startproject 项目名  # 创建scrapy项目
    2. scrapy genspider 爬虫名 域名
    3. scrapy crawl 爬虫名

    任务描述:

    1、爬取凤凰网,网址是:http://app.finance.ifeng.com/list/stock.php?t=ha,爬取此网页中沪市A股的代码、名称、最新价等信息。

    2、将文件保存在H:\2022年学习资料中。

    3、项目名为ifengNews

    二、实现步骤

    1、使用cmd进入要建项目的目录【2022学习资料】使用命令【scrapy startproject ifengNews创建scrapy项目

    效果:出现【蓝框】内容,【ifengNews】项目已经创建成功。

     

    2、使用pycharm打开文件夹【ifengNews】。文件目录如下:

    items.py:定义爬虫程序的数据模型

    middlewares.py:定义数据模型中的中间件

    pipelines.py:管道文件,负责对爬虫返回数据的处理

    settings.py:爬虫程序设置,主要是一些优先级设置(将ROBOTSTXT_OBEY=True  改为  False,这行代码表示是否遵循爬虫协议,如果是Ture的可能有些内容无法爬取)

    scrapy.cfg:内容为scrapy的基础配置

    spiders目录:放置spider代码的目录

     3、在pycharm终端中输入【scrapy genspider ifeng_spider ifeng.com】   其中:ifeng_spider 是文件名,可以自定义,但是不能与项目名一样;ifeng.com为域名。

    效果:spiders文件夹下创建一个ifeng_spider.py文件,爬虫代码都写在此文件的def parse中。

     3.1此步骤也可在cmd中完成。

     4、修改setting

    第一个是不遵循机器人协议

    1. # Obey robots.txt rules
    2. ROBOTSTXT_OBEY = False # 是否遵循机器人协议,默认是true,需要改为false,否则很多东西爬不了

    个是请求头,添加一个User-Agent

    1. DEFAULT_REQUEST_HEADERS = {
    2. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    3. 'Accept-Language': 'en',
    4. 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
    5. 'Cookie':'adb_isBlock=0; userid=1652710683278_ihrfq92084; prov=cn0731; city=0732; weather_city=hn_xt; region_ip=110.53.149.x; region_ver=1.2; wxIsclose=false; ifengRotator_iis3=6; ifengWindowCookieName_919=1'
    6. # 默认是注释的,这个东西非常重要,如果不写很容易被判断为电脑,简单点洗一个Mozilla/5.0即可
    7. }

    三个是打开一个管道

    1. # ITEM_PIPELINES:项目管道,300为优先级,越低越爬取的优先度越高
    2. ITEM_PIPELINES = {
    3. 'ifengNews.pipelines.IfengnewsPipeline': 300,
    4. # 'subeiNews.pipelines.SubeinewsMysqlPipeline': 200, # 存数据的管道
    5. }

    5、页面爬取。首先在ifeng_spider.py中写自己的爬虫文件:

    1. import scrapy
    2. from ifengNews.items import IfengnewsItem
    3. class IfengSpiderSpider(scrapy.Spider):
    4. name = 'ifeng_spider'
    5. allowed_domains = ['ifeng.com']
    6. start_urls = ['http://app.finance.ifeng.com/list/stock.php?t=ha'] # 爬取地址
    7. def parse(self, response):
    8. # 爬取股票具体的信息
    9. for con in response.xpath('//*[@class="tab01"]/table/tr'):
    10. items = IfengnewsItem()
    11. flag = con.xpath('./td[3]//text()').get() # 最新价
    12. if flag:
    13. items['title'] = response.xpath('//div[@class="block"]/h1/text()').get()
    14. items['code'] = con.xpath('./td[1]//text()').get() # 代码
    15. items['name'] = con.xpath('./td[2]//text()').get() # 名称
    16. items['latest_price'] = con.xpath('./td[3]//text()').get() # 最新价
    17. items['quote_change'] = con.xpath('./td[4]//text()').get() # 涨跌幅
    18. items['quote_num'] = con.xpath('./td[5]//text()').get() # 涨跌额
    19. items['volume'] = con.xpath('./td[6]//text()').get() # 成交量
    20. items['turnover'] = con.xpath('./td[7]//text()').get() # 成交额
    21. items['open_today'] = con.xpath('./td[8]//text()').get() # 今开盘
    22. items['closed_yesterday'] = con.xpath('./td[9]//text()').get() # 昨收盘
    23. items['lowest_price'] = con.xpath('./td[10]//text()').get() # 最低价
    24. items['highest_price'] = con.xpath('./td[11]//text()').get() # 最高价
    25. print(items['title'], items['name'])
    26. yield items

    打开items.py,更改items.py用于存储数据:

    1. import scrapy
    2. class IfengnewsItem(scrapy.Item):
    3. # define the fields for your item here like:
    4. # name = scrapy.Field()
    5. title = scrapy.Field()
    6. code = scrapy.Field()
    7. name = scrapy.Field()
    8. latest_price = scrapy.Field()
    9. quote_change = scrapy.Field()
    10. quote_num = scrapy.Field()
    11. volume = scrapy.Field()
    12. turnover = scrapy.Field()
    13. open_today = scrapy.Field()
    14. closed_yesterday = scrapy.Field()
    15. lowest_price = scrapy.Field()
    16. highest_price = scrapy.Field()

    如要实现二级页面、翻页等操作,需自行学习。

    6、运行爬虫:在终端中输入scrapy crawl ifeng_spider】.

    6.1 也可以写一个run.py文件来运行程序,将数据存储在infos.csv中。

    demo下载:单独使用scrapy实现简单爬虫-Python文档类资源-CSDN下载单独使用scrapy实现简单爬虫更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/weixin_56516468/85745577

    任务三、django+scrapy结合

    任务描述:将Django和scrapy结合,实现通过Django控制scrapy的运行,并将爬取的数据存入数据库。

    1、在Django项目的根目录中创建一个子应用warehouse,单独存放scrapy的数据库等信息。使用命令行创建app,在终端输入执行命令:python manage.py startapp warehouse.

    此时的目录结构:

    并在pro-settings.py中注册warehouse这个应用,如下图。

    2、在Django项目中创建scrapy项目,并修改项目的setting.py,与任务二中的步骤4一致.

    并调整目录结构,与下图一致:

     3、在scrapy的setting.py中加入以下代码:

    1. import os
    2. import sys
    3. import django
    4. sys.path.append(os.path.dirname(os.path.abspath('.')))
    5. os.environ['DJANGO_SETTINGS_MODULE'] = 'pro.settings' # 项目名.settings
    6. django.setup()

    4、warehouse下的model.py中创建数据库,用来存储爬到的数据。并在终端执行命令python manage.py makemigrations和 python manage.py migrate,生成数据库表。

    1. from django.db import models
    2. class StockInfo(models.Model):
    3. """
    4. 股票信息
    5. """
    6. title = models.TextField(verbose_name="股票类型" )
    7. code = models.TextField(verbose_name="代码" )
    8. name = models.TextField(verbose_name="名称" )
    9. latest_price = models.TextField(verbose_name="最新价" )
    10. quote_change = models.TextField(verbose_name="涨跌幅" )
    11. quote_num = models.TextField(verbose_name="涨跌额" )
    12. volume = models.TextField(verbose_name="成交量" )
    13. turnover = models.TextField(verbose_name="成交额" )
    14. open_today = models.TextField(verbose_name="今开盘" )
    15. closed_yesterday = models.TextField(verbose_name="昨收盘" )
    16. lowest_price = models.TextField(verbose_name="最低价" )
    17. highest_price = models.TextField(verbose_name="最高价" )

    5、修改pipelines.py 、 items.py 、 ifeng_spider.py。

    ifeng_spider.py:

    1. import scrapy
    2. from ifengNews.items import IfengnewsItem
    3. class IfengSpiderSpider(scrapy.Spider):
    4. name = 'ifeng_spider'
    5. allowed_domains = ['ifeng.com']
    6. start_urls = ['http://app.finance.ifeng.com/list/stock.php?t=ha']
    7. def parse(self, response):
    8. # 爬取股票具体的信息
    9. for con in response.xpath('//*[@class="tab01"]/table/tr'):
    10. items = IfengnewsItem()
    11. flag = con.xpath('./td[3]//text()').get() # 最新价
    12. if flag:
    13. items['title'] = response.xpath('//div[@class="block"]/h1/text()').get()
    14. items['code'] = con.xpath('./td[1]//text()').get() # 代码
    15. items['name'] = con.xpath('./td[2]//text()').get() # 名称
    16. items['latest_price'] = con.xpath('./td[3]//text()').get() # 最新价
    17. items['quote_change'] = con.xpath('./td[4]//text()').get() # 涨跌幅
    18. items['quote_num'] = con.xpath('./td[5]//text()').get() # 涨跌额
    19. items['volume'] = con.xpath('./td[6]//text()').get() # 成交量
    20. items['turnover'] = con.xpath('./td[7]//text()').get() # 成交额
    21. items['open_today'] = con.xpath('./td[8]//text()').get() # 今开盘
    22. items['closed_yesterday'] = con.xpath('./td[9]//text()').get() # 昨收盘
    23. items['lowest_price'] = con.xpath('./td[10]//text()').get() # 最低价
    24. items['highest_price'] = con.xpath('./td[11]//text()').get() # 最高价
    25. print(items['title'], items['name'])
    26. yield items

    pipelines.py:

    1. class IfengnewsPipeline(object):
    2. def process_item(self, item, spider):
    3. print('打开了数据库')
    4. item.save()
    5. print('关闭了数据库')
    6. return item

    items.py中, 导入DjangoItem,与数据库进行连接。

    1. from warehouse.models import StockInfo
    2. from scrapy_djangoitem import DjangoItem
    3. class IfengnewsItem(DjangoItem):
    4. django_model = StockInfo

    如下图安装scrapy_djangoitem:
    5、

     6、修改url.py 、views.py

     

     7、 运行程序,在浏览器中输入http://127.0.0.1:8000/stocks/update/.页面返回ok,则可以在数据库中查看到爬取的数据。

    demo下载:

    django+scrapy结合-Python文档类资源-CSDN下载将Django和scrapy结合,实现通过Django控制scrapy的运行,并将爬取的数据存入数据更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/weixin_56516468/85750917

  • 相关阅读:
    web移动开发之flex(弹性盒子---知识点篇)
    做开发一段时间之后,发现C盘所剩空间越来越少,开发专属的C盘清理命令。
    在Vue项目中添加字典翻译工具(暂存,后面优化)
    【编程之路】面试必刷TOP101:链表(01-05,Python实现)
    Redis常用命令
    java数据结构与算法刷题-----LeetCode28:实现 strStr()
    【0基础学算法】二分查找 (超详细讲解+私人笔记+源码)
    Scrapy第八篇:User-Agent中间件
    django之day01
    Flink通过Native Kubernetes(k8s)方式Session模式和Application模式进行部署
  • 原文地址:https://blog.csdn.net/weixin_56516468/article/details/125008516