Django动态传值给scrapy进行爬虫

dajngo是同步的,而scrapy是异步的.集合起来并不是很理想。
效果如下
B站

S90415-10391650


整个项目在我的github上面,项目结构有点乱
cmzzGithub

再寻找资料的过程中,找到一种代替的方法.就是

scrapy爬虫框架部署在scrapyd上面,django框架在view通过requests包动态传值,调用scrapy爬虫框架爬取数据然后存入数据库.然后view再从数据库中取出数据.(这里会有一个挺大的问题就是view取数据会比scrapy爬取要快,可以在view使用sleep()解决)

一个动态传值的spider爬虫的写法

class TaobaoSpider(scrapy.Spider):
    name = 'taobao'
    allowed_domains = ['taobao.com', 'rate.tmall.com']

    # 这里初始化这个类,可以动态传值并开始爬虫,这里传的是keyword
    def __init__(self, keyword=None, *args, **kwargs):   
        super(TaobaoSpider, self).__init__(*args, **kwargs)   
        self.start_urls = ['https://s.taobao.com/search?q={}'.format(keyword)]
        self.keyword = keyword

    def parse(self, response):
    	pass

官方文档:
scrapyd,ubuntu使用apt-get install scrapyd,Windows 下pip install scrapyd

一个比较好的scrapyd部署教程

安装之后,在scrapy.cfg同级目录下命令scrapyd,然后服务就开启了.
在这里插入图片描述
然后目录会多出twistd.pidsetup.py,build目录.
然后部署scrapy爬虫,下载scrapyd-client

pip install scrapyd-client

安装完scrapy-client之后,配置一下scrapy.cfg
在deploy后面加上名字[deploy:***]可以自己定义,window会出现scrapyd-deploy无法使用。
解决办法:在虚拟环境的Scripts中新建scrapyd-deploy.bat文件
写入

@echo off

"自己虚拟环境的全路径\Scripts\python.exe" "自己虚拟环境全路径\Scripts\scrapyd-deploy" %*

就可以通过scrapyd-deploy <target> -p <project> --version <version>

参数解释
target :depoly 后面的名称(自己之前写的)
project :建议使用项目名字(应该是可以不用)
version 版本,自己定义,不写为当前时间
ex
scrapyd-deploy 100 -p taobao --version 1.0
scrapy部署这里不多说了,网上自己搜索.要是部署没有出错的话,我们scrapydapi查看项目状态.
浏览器输入http://localhost:6800/listprojects.json查看爬虫项目信息
在这里插入图片描述
这里面有一个很重要的信息,就是这个projects的名字.我一开始部署完之后,并不知project的名字是是什么,导致后来找了很久,我们动态传值的时候,要以字典的形式传这个projects的值
通过requests传值如下
在这里插入图片描述
可以使用scrapy-djangoitem将scrapy的item存入到django的数据库中,scrapy框架的items.pypipelines.py都很简单地写
ex

from scrapy_djangoitem import DjangoItem

from taobao.models import *


class ProductName(DjangoItem):
    django_model = ProductName


class JDProductsItem(DjangoItem):
    django_model = JDProductsItem


class JDCommentSummaryItem(DjangoItem):
    django_model = JDCommentSummaryItem


class JDHotCommentTagItem(DjangoItem):
    django_model = JDHotCommentTagItem


class JDCommentItem(DjangoItem):
    django_model = JDCommentItem

在pipelines.py中直接用item.save()就可以代替一大串的sql语句

        if isinstance(item, ProductName):
            try:
                item.save()
                # cur = self.conn.cursor()
                # sql = '''insert into product values (%s,%s,%s,%s,%s,%s,%s)'''
                # self.conn.ping(reconnect=True)
                # cur.execute(sql,(item['productid'],item['category'],item['description'],item['name'],item['imgurl'],item['reallyPrice'],item['url']))
                # cur.close()
                # self.conn.commit()
                # self.conn.close()
            except Exception as e:
                print(e)
        elif isinstance(item, JDProductsItem):
            try:
                item.save()
                # cur = self.conn.cursor()
                # sql = '''insert into productlink values (%s,%s)'''
                # self.conn.ping(reconnect=True)
                # cur.execute(sql,(item['id'], item['imgurl']))
                # cur.close()
                # self.conn.commit()
                # self.conn.close()
            except Exception as e:
                print(e)

此外国外有人做一个django-dynamic-scraper的项目,有兴趣的同学,可以进行尝试一下.

2020/5/5更新

在看了一下scrapy文档和scrapyd的代码之后,可以不使用django web框架
在scrapy文档中
在这里插入图片描述
添加链接描述
是支持web service的,但是我想这个会比较简单。
而在scrapyd中,scrapyd是基于python的Twisted异步事务框架的。
在这里插入图片描述
在找到源码中相应的代码。

webservice.py包含了web的所有api
在这里插入图片描述

website.py这是web的入口
在这里插入图片描述

在这里插入图片描述
所以我们也就可以用Twisted来代替django,写出相应的web服务,Twisted没有相应的model模块,大家可以使用别的代替如(我之前用过的peewee模块,或者可以参考廖雪峰教程中自己写出来)
在这里插入图片描述

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
当使用Django前端给后端时,可能会遇到一些问题。以下是可能出现的一些常见问题和解决方法: 1. 页面表单提交问题:在表单提交时,可能会出现数据未成功递到后端的情况。这可能是由于表单的重定向或提交地址不正确导致的。要解决这个问题,可以检查表单的 "action" 属性和 "method" 属性是否正确设置。 2. 数据类型问题:前端可能会将数据以不正确的数据类型递给后端。例如,前端将字符串递给后端需要整数的字段。要解决这个问题,可以使用Django的表单验证来验证数据类型并进行相应的类型转换。 3. 跨站请求伪造(CSRF)问题:Django默认开启了CSRF保护,如果前端没有正确的CSRF令牌,将无法成功发送POST请求。要解决这个问题,可以在前端的表单中添加{% csrf_token %}标签,并确保在提交表单时,令牌被正确地发送到后端。 4. 异步请求问题:如果前端使用异步请求(例如AJAX)来递数据给后端,可能会出现数据未成功递的问题。要解决这个问题,可以检查异步请求的URL是否正确,后端是否正确处理异步请求,并在前端处理成功或失败的回调函数中进行相应的操作。 总之,正确递前端数据给后端的过程涉及到多个环节,包括表单提交、数据类型验证、CSRF保护和异步请求等。在遇到问题时,可以逐一检查每个环节,找出并解决导致数据递不成功的原因。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值