导航:首页 > 编程语言 > pythonscrapy13

pythonscrapy13

发布时间:2022-05-27 05:48:22

㈠ 如何在scrapy框架下用python爬取json文件

生成Request的时候与一般的网页是相同的,提交Request后scrapy就会下载相应的网页生成Response,这时只用解析response.body按照解析json的方法就可以提取数据了。代码示例如下(以京东为例,其中的parse_phone_price和parse_commnets是通过json提取的,省略部分代码):

# -*- coding: utf-8 -*-
 
from scrapy.spiders import Spider, CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from jdcom.items import JdPhoneCommentItem, JdPhoneItem
from scrapy import Request
from datetime import datetime
import json
import logging
import re
 
logger = logging.getLogger(__name__)
 
 
class JdPhoneSpider(CrawlSpider):
    name = "jdPhoneSpider"
    start_urls = ["http://list.jd.com/list.html?cat=9987,653,655"]
 
    rules = (
        Rule(
            LinkExtractor(allow=r"list\.html\?cat\=9987,653,655\&page\=\d+\&trans\=1\&JL\=6_0_0"),
            callback="parse_phone_url",
            follow=True,
        ),
    )
 
    def parse_phone_url(self, response):
        hrefs = response.xpath("//div[@id='plist']/ul/li/div/div[@class='p-name']/a/@href").extract()
        phoneIDs = []
        for href in hrefs:
            phoneID = href[14:-5]
            phoneIDs.append(phoneID)
            commentsUrl = "http://sclub.jd.com/proctpage/p-%s-s-0-t-3-p-0.html" % phoneID
            yield Request(commentsUrl, callback=self.parse_commnets)
 
    def parse_phone_price(self, response):
        phoneID = response.meta['phoneID']
        meta = response.meta
        priceStr = response.body.decode("gbk", "ignore")
        priceJson = json.loads(priceStr)
        price = float(priceJson[0]["p"])
        meta['price'] = price
        phoneUrl = "http://item.jd.com/%s.html" % phoneID
        yield Request(phoneUrl, callback=self.parse_phone_info, meta=meta)
 
    def parse_phone_info(self, response):  
        pass
 
    def parse_commnets(self, response):
 
        commentsItem = JdPhoneCommentItem()
        commentsStr = response.body.decode("gbk", "ignore")
        commentsJson = json.loads(commentsStr)
        comments = commentsJson['comments']
 
        for comment in comments:
            commentsItem['commentId'] = comment['id']
            commentsItem['guid'] = comment['guid']
            commentsItem['content'] = comment['content']
            commentsItem['referenceId'] = comment['referenceId']
            # 2016-09-19 13:52:49  %Y-%m-%d %H:%M:%S
            datetime.strptime(comment['referenceTime'], "%Y-%m-%d %H:%M:%S")
            commentsItem['referenceTime'] = datetime.strptime(comment['referenceTime'], "%Y-%m-%d %H:%M:%S")
 
            commentsItem['referenceName'] = comment['referenceName']
            commentsItem['userProvince'] = comment['userProvince']
            # commentsItem['userRegisterTime'] = datetime.strptime(comment['userRegisterTime'], "%Y-%m-%d %H:%M:%S")
            commentsItem['userRegisterTime'] = comment.get('userRegisterTime')
            commentsItem['nickname'] = comment['nickname']
            commentsItem['userLevelName'] = comment['userLevelName']
            commentsItem['userClientShow'] = comment['userClientShow']
            commentsItem['proctColor'] = comment['proctColor']
            # commentsItem['proctSize'] = comment['proctSize']
            commentsItem['proctSize'] = comment.get("proctSize")
            commentsItem['afterDays'] = int(comment['days'])
            images = comment.get("images")
            images_urls = ""
            if images:
                for image in images:
                    images_urls = image["imgUrl"] + ";"
            commentsItem['imagesUrl'] = images_urls
        yield commentsItem
 
        commentCount = commentsJson["proctCommentSummary"]["commentCount"]
        goodCommentsCount = commentsJson["proctCommentSummary"]["goodCount"]
        goodCommentsRate = commentsJson["proctCommentSummary"]["goodRate"]
        generalCommentsCount = commentsJson["proctCommentSummary"]["generalCount"]
        generalCommentsRate = commentsJson["proctCommentSummary"]["generalRate"]
        poorCommentsCount = commentsJson["proctCommentSummary"]["poorCount"]
        poorCommentsRate = commentsJson["proctCommentSummary"]["poorRate"]
        phoneID = commentsJson["proctCommentSummary"]["proctId"]
 
        priceUrl = "http://p.3.cn/prices/mgets?skuIds=J_%s" % phoneID
        meta = {
            "phoneID": phoneID,
            "commentCount": commentCount,
            "goodCommentsCount": goodCommentsCount,
            "goodCommentsRate": goodCommentsRate,
            "generalCommentsCount": generalCommentsCount,
            "generalCommentsRate": generalCommentsRate,
            "poorCommentsCount": poorCommentsCount,
            "poorCommentsRate": poorCommentsRate,
        }
        yield Request(priceUrl, callback=self.parse_phone_price, meta=meta)
 
        pageNum = commentCount / 10 + 1
        for i in range(pageNum):
            commentsUrl = "http://sclub.jd.com/proctpage/p-%s-s-0-t-3-p-%d.html" % (phoneID, i)
            yield Request(commentsUrl, callback=self.parse_commnets)

㈡ python scrapy是什么意思

Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。

㈢ python scrapy问题

你的错误信息贴的不全,是不是最后几行有行 write(...., async=False) 的错误?如果是这个错误的话,你需要打这行代码所在文件,把相关的async 改成 async1 或其它名称,因为在新版本python中, async 是一个关键字,冲突了。

㈣ python中的scrapy是什么意思a

Scrapy英文意思是刮擦
被用来命名爬虫界知名的框架。
使用这个框架可以轻易实现常规网页采集。也支持大型架构。升级后redis更是支持分布式。利用scrapyd更是可以发布服务。
从事爬虫方向必学!

㈤ 如何在scrapy框架下,用python实现爬虫自动跳转页面来抓去网页内容

Scrapy是一个用Python写的Crawler Framework,简单轻巧,并且非常方便。Scrapy使用Twisted这个异步网络库来处理网络通信,架构清晰,并且包含了各种中间件接口,可以灵活地完成各种需求。Scrapy整体架构如下图所示:

根据架构图介绍一下Scrapy中的各大组件及其功能:

Scrapy引擎(Engine):负责控制数据流在系统的所有组建中流动,并在相应动作发生触发事件。
调度器(Scheler):从引擎接收Request并将它们入队,以便之后引擎请求request时提供给引擎。
下载器(Downloader):负责获取页面数据并提供给引擎,而后提供给Spider。
Spider:Scrapy用户编写用于分析Response并提取Item(即获取到的Item)或额外跟进的URL的类。每个Spider负责处理一个特定(或一些网站)。
Item Pipeline:负责处理被Spider提取出来的Item。典型的处理有清理验证及持久化(例如存储到数据库中,这部分后面会介绍存储到MySQL中,其他的数据库类似)。
下载器中间件(Downloader middlewares):是在引擎即下载器之间的特定钩子(special hook),处理Downloader传递给引擎的Response。其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能(后面会介绍配置一些中间并激活,用以应对反爬虫)。
Spider中间件(Spider middlewares):是在引擎及Spider之间的特定钩子(special hook),处理Spider的输入(response)和输出(Items即Requests)。其提供了一个简便的机制,通过插入自定义的代码来扩展Scrapy功能。

㈥ python怎么安装scrapy

安装scrapy一般使用pip方式安装,因此需要先安装pip

  1. 如果未安装pip,先安装pip,网络搜索一下即可获得py文件

    pythonget-pip.py
  2. 如果已安装pip,则直接

pipinstallScrapy

在安装过程中缺什么就安装什么就好了

㈦ scrapy和python有什么关系

Scrapy是Python开发的一个快速、高层次的web数据抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘和监测。

Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等。

Scrapy算得上是Python世界中最常用的爬虫框架了,同时它也是我掌握的几种流行语言中最好的爬虫框架,没有之一!我认为它也是最难学习的框架,同样没有之一。很多初学Scarpy的经常向我抱怨完全不清楚Scrapy该怎样入手,即使看的是中文的文档,也感到很难理解。我当初接触Scrapy时也有这样的感觉。之所以感到Scrapy难学,究其原因,是其官方文档实在太过凌乱,又缺少实用的代码例子,让人看得云里雾里,不知其所已然。虽然其文档不良,但却没有遮挡住它的光辉,它依然是Python世界中目前最好用的爬虫框架。其架构的思路、蜘蛛执行的效能,还有可扩展的能力都非常出众,再配以Python语言的简洁轻巧,使得爬虫的开发事半功倍。

相关推荐:《Python基础教程》

Scrapy的优点:

(1)提供了内置的HTTP缓存,以加速本地开发。

(2)提供了自动节演调节机制,而且具有遵守robots.txt的设置的能力。

(3)可以定义爬行深度的限制,以避免爬虫进入死循环链接。

(4)会自动保留会话。

(5)执行自动HTTP基本认证。不需要明确保存状态。

(6)可以自动填写登录表单。

(7)Scrapy有一个内置的中间件,可以自动设置请求中的引用(referrer)头。

(8)支持通过3xx响应重定向,也可以通过HTML元刷新。

(9)避免被网站使用的meta重定向困住,以检测没有JS支持的页面。

(10)默认使用CSS选择器或XPath编写解析器。

(11)可以通过Splash或任何其他技术(如Selenium)呈现JavaScript页面。

(12)拥有强大的社区支持和丰富的插件和扩展来扩展其功能。

(13)提供了通用的蜘蛛来抓取常见的格式:站点地图、CSV和XML。

(14)内置支持以多种格式(JSON、CSV、XML、JSON-lines)导出收集的数据并将其存在多个后端(FTP、S3、本地文件系统)中。

Scrapy框架原理

Scrapy Engine(引擎):负责Spider、ItemPipeline、Downloader、Scheler中间的通讯,信号、数据传递等。

Scheler(调度器):负责接收引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。

Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,

Spider(爬虫):负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheler(调度器),

Item Pipeline(管道):负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.

Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。

Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

Scrapy各个组件介绍

·Scrapy Engine:

引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。它也是程序的入口,可以通过scrapy指令方式在命令行启动,或普通编程方式实例化后调用start方法启动。

·调度器(Scheler)

调度器从引擎接收爬取请求(Request)并将它们入队,以便之后引擎请求它们时提供给引擎。一般来说,我们并不需要直接对调度器进行编程,它是由Scrapy主进程进行自动控制的。

·下载器(Down-loader)

下载器负责获取页面数据并提供给引擎,而后将网站的响应结果对象提供给蜘蛛(Spider)。具体点说,下载器负责处理产生最终发出的请求对象 Request 并将返回的响应生成 Response对象传递给蜘蛛。

·蜘蛛——Spiders

Spider是用户编写用于分析响应(Response)结果并从中提取Item(即获取的Item)或额外跟进的URL的类。每个Spider负责处理一个特定(或一些)网站。

·数据管道——Item Pipeline

Item Pipeline 负责处理被 Spider 提取出来的 Item。 典型的处理有清理、验证及持久化(例如,存取到数据库中)。

·下载器中间件(Downloader middle-wares)

下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的Response。其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy的功能。

·Spider中间件(Spider middle-wares)

Spider 中间件是在引擎及 Spider 之间的特定钩子(specific hook),处理 Spider 的输入(Response)和输出(Items及Requests)。其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy的功能。

从Scrapy的系统架构可见,它将整个爬网过程进行了非常具体的细分,并接管了绝大多数复杂的工作,例如,产生请求和响应对象、控制爬虫的并发等。

㈧ 怎么样使用Python的Scrapy爬虫框架

有些人问,开发网络爬虫应该选择Nutch、Crawler4j、WebMagic、scrapy、WebCollector还是其他的?这里按照我的经验随便扯淡一下:

上面说的爬虫,基本可以分3类:

1.分布式爬虫:Nutch

2.JAVA单机爬虫:Crawler4j、WebMagic、WebCollector

3. 非JAVA单机爬虫:scrapy

第一类:分布式爬虫

爬虫使用分布式,主要是解决两个问题:

1)海量URL管理

2)网速

现在比较流行的分布式爬虫,是Apache的Nutch。但是对于大多数用户来说,Nutch是这几类爬虫里,最不好的选择,理由如下:

1)Nutch是为搜索引擎设计的爬虫,大多数用户是需要一个做精准数据爬取(精抽取)的爬虫。Nutch运行的一套流程里,有三分之二是为了搜索引擎而设计的。对精抽取没有太大的意义。也就是说,用Nutch做数据抽取,会浪费很多的时间在不必要的计算上。而且如果你试图通过对Nutch进行二次开发,来使得它适用于精抽取的业务,基本上就要破坏Nutch的框架,把Nutch改的面目全非,有修改Nutch的能力,真的不如自己重新写一个分布式爬虫框架了。

2)Nutch依赖hadoop运行,hadoop本身会消耗很多的时间。如果集群机器数量较少,爬取速度反而不如单机爬虫快。

3)Nutch虽然有一套插件机制,而且作为亮点宣传。可以看到一些开源的Nutch插件,提供精抽取的功能。但是开发过Nutch插件的人都知道,Nutch的插件系统有多蹩脚。利用反射的机制来加载和调用插件,使得程序的编写和调试都变得异常困难,更别说在上面开发一套复杂的精抽取系统了。而且Nutch并没有为精抽取提供相应的插件挂载点。Nutch的插件有只有五六个挂载点,而这五六个挂载点都是为了搜索引擎服务的,并没有为精抽取提供挂载点。大多数Nutch的精抽取插件,都是挂载在“页面解析”(parser)这个挂载点的,这个挂载点其实是为了解析链接(为后续爬取提供URL),以及为搜索引擎提供一些易抽取的网页信息(网页的meta信息、text文本)。

4)用Nutch进行爬虫的二次开发,爬虫的编写和调试所需的时间,往往是单机爬虫所需的十倍时间不止。了解Nutch源码的学习成本很高,何况是要让一个团队的人都读懂Nutch源码。调试过程中会出现除程序本身之外的各种问题(hadoop的问题、hbase的问题)。

5)很多人说Nutch2有gora,可以持久化数据到avro文件、hbase、mysql等。很多人其实理解错了,这里说的持久化数据,是指将URL信息(URL管理所需要的数据)存放到avro、hbase、mysql。并不是你要抽取的结构化数据。其实对大多数人来说,URL信息存在哪里无所谓。

6)Nutch2的版本目前并不适合开发。官方现在稳定的Nutch版本是nutch2.2.1,但是这个版本绑定了gora-0.3。如果想用hbase配合nutch(大多数人用nutch2就是为了用hbase),只能使用0.90版本左右的hbase,相应的就要将hadoop版本降到hadoop 0.2左右。而且nutch2的官方教程比较有误导作用,Nutch2的教程有两个,分别是Nutch1.x和Nutch2.x,这个Nutch2.x官网上写的是可以支持到hbase 0.94。但是实际上,这个Nutch2.x的意思是Nutch2.3之前、Nutch2.2.1之后的一个版本,这个版本在官方的SVN中不断更新。而且非常不稳定(一直在修改)。

所以,如果你不是要做搜索引擎,尽量不要选择Nutch作为爬虫。有些团队就喜欢跟风,非要选择Nutch来开发精抽取的爬虫,其实是冲着Nutch的名气(Nutch作者是Doug Cutting),当然最后的结果往往是项目延期完成。

如果你是要做搜索引擎,Nutch1.x是一个非常好的选择。Nutch1.x和solr或者es配合,就可以构成一套非常强大的搜索引擎了。如果非要用Nutch2的话,建议等到Nutch2.3发布再看。目前的Nutch2是一个非常不稳定的版本。

㈨ python scrapy 怎么将爬取的内容写出

首先,安装Python,坑太多了,一个个爬。由于我是windows环境,没钱买mac, 在安装的时候遇到各种各样的问题,确实各种各样的依赖。安装教程不再赘述。如果在安装的过程中遇到 ERROR:需要windows c/c++问题,一般是由于缺少windows开发编译环境,晚上大多数教程是安装一个VisualStudio,太不靠谱了,事实上只要安装一个WindowsSDK就可以了。下面贴上我的爬虫代码:

爬虫主程序:

[python]view plain

㈩ Python安装Scrapy出现以下错误怎么办

.interface都是OK的。当importOpenSSL时出现错误提示:Traceback(mostrecentcalllast):File"",line1,inimportOpenSSLFile"D:\pythoninstall\lib\site-packages\OpenSSL__init__.py",line13,:DLLloadfailed:%1不是有效的Win32应用程序。我安装的是pyOpenSSL-0.13.1.win-amd64-py2.7.exe缺少openssl相关的dll,或者你跟前几天 群里的一位一样,版本不匹配。如果你安装的是32位Python,请不要使用64位库。文件名里没有amd64的安装包就是32位的。

阅读全文

与pythonscrapy13相关的资料

热点内容
单片机代码跳掉 浏览:447
程序员谈薪水压价 浏览:861
荣耀10青春版支持方舟编译啊 浏览:158
最优估计pdf 浏览:826
androiddrawtext字体 浏览:669
c语言源编辑源程序编译 浏览:821
手里捏东西真的可以解压吗 浏览:265
编译原理画状态表 浏览:28
用echo命令产生下列输出 浏览:358
在内网如何访问服务器 浏览:960
java导入oracle数据库 浏览:134
坚朗内开内倒铝条算法 浏览:259
华为阅读新建文件夹 浏览:770
幻塔如何选择服务器 浏览:221
解压先把文件压到系统盘 浏览:822
access压缩和修复数据库 浏览:791
光纤交换机命令 浏览:513
白色桌放什么文件夹 浏览:296
分治算法思想 浏览:151
s曲线加减速算法 浏览:403