怎么在Django中使用Scrapy爬取数据

怎么在Django中使用Scrapy爬取数据?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在django项目根目录位置创建scrapy项目,django_12是django项目,ABCkg是scrapy爬虫项目,app1是django的子应用

怎么在Django中使用Scrapy爬取数据

2.在Scrapy的settings.py中加入以下代码

importos
importsys
sys.path.append(os.path.dirname(os.path.abspath('.')))
os.environ['DJANGO_SETTINGS_MODULE']='django_12.settings'#项目名.settings
importdjango
django.setup()

3.编写爬虫,下面代码以ABCkg为例,abckg.py

#-*-coding:utf-8-*-
importscrapy
fromABCkg.itemsimportAbckgItem

classAbckgSpider(scrapy.Spider):
name='abckg'#爬虫名称
allowed_domains=['www.abckg.com']#允许爬取的范围
start_urls=['http://www.abckg.com/']#第一次请求的地址
defparse(self,response):
print('返回内容:{}'.format(response))
"""
解析函数
:paramresponse:响应内容
:return:
"""
listtile=response.xpath('//*[@id="container"]/div/div/h3/a/text()').extract()
listurl=response.xpath('//*[@id="container"]/div/div/h3/a/@href').extract()

forindexinrange(len(listtile)):
item=AbckgItem()
item['title']=listtile[index]
item['url']=listurl[index]
yieldscrapy.Request(url=listurl[index],callback=self.parse_content,method='GET',dont_filter=True,meta={'item':item})
#获取下一页
nextpage=response.xpath('//*[@id="container"]/div[1]/div[10]/a[last()]/@href').extract_first()
print('即将请求:{}'.format(nextpage))
yieldscrapy.Request(url=nextpage,callback=self.parse,method='GET',dont_filter=True)
#获取详情页
defparse_content(self,response):
item=response.meta['item']
item['content']=response.xpath('//*[@id="post-1192"]/dd/p').extract()
print('内容为:{}'.format(item))
yielditem

4.scrapy中item.py 中引入django模型类

pipinstallscrapy-djangoitem
fromapp1importmodels
fromscrapy_djangoitemimportDjangoItem

classAbckgItem(DjangoItem):
#definethefieldsforyouritemherelike:
#name=scrapy.Field()#普通scrapy爬虫写法
#title=scrapy.Field()
#url=scrapy.Field()
#content=scrapy.Field()
django_model=models.ABCkg#注入django项目的固定写法,必须起名为django_model=django中models.ABCkg表

5.pipelines.py中调用save()

importjson
frompymongoimportMongoClient
#用于接收parse函数发过来的item
classAbckgPipeline(object):
#i=0
defopen_spider(self,spider):
#print('打开文件')
ifspider.name=='abckg':
self.f=open('abckg.json',mode='w')
defprocess_item(self,item,spider):
##print('ABC管道接收:{}'.format(item))
#ifspider.name=='abckg':
#self.f.write(json.dumps(dict(item),ensure_ascii=False))
##elifspider.name=='cctv':
##img=requests.get(item['img'])
##ifimg!='':
##withopen('图片\%d.png'%self.i,mode='wb')asf:
##f.write(img.content)
##self.i+=1
item.save()
returnitem#将item传给下一个管道执行
defclose_spider(self,spider):
#print('关闭文件')
self.f.close()

6.在django中models.py中一个模型类,字段对应爬取到的数据,选择适当的类型与长度

classABCkg(models.Model):
title=models.CharField(max_length=30,verbose_name='标题')
url=models.CharField(max_length=100,verbose_name='网址')
content=models.CharField(max_length=200,verbose_name='内容')
classMeta:
verbose_name_plural='爬虫ABCkg'
def__str__(self):
returnself.title

7.通过命令启动爬虫:scrapy crawl 爬虫名称

8.django进入admin后台即可看到爬取到的数据。

关于怎么在Django中使用Scrapy爬取数据问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注恰卡编程网行业资讯频道了解更多相关知识。

发布于 2021-03-24 01:21:15
收藏
分享
海报
0 条评论
171
上一篇:在docker中拉取mysql镜像太慢如何解决 下一篇:怎么在docker中使用volume命令删除卷
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码