python爬虫资源路径报错_Python3 Scrapy爬虫框架使用

python爬虫资源路径报错_Python3 Scrapy爬虫框架使用

问:把网站装进爬虫需要几步?

答:四步。

  1. 新建项目

  2. 明确目标

  3. 制作爬虫

  4. 存储内容

注意:# coding=utf-8 使用Scrapy爬虫框架时应该添加此条语句表明注释是中文注释

  1. 新建项目

使用命令新建一个scrapy项目scrapy startproject projectName

建立项目的文件目录scrapyproject

├── scrapy.cfg

└── scrapyproject

├── init.py

├── items.py

├── middlewares.py

├── pipelines.py

├── settings.py

└── spiders

└── init.py

2 directories, 7 files

各个文件的作用:scrapy.cfg :项目的配置文件

scrapyproject/ :项目的Python模块,将会从这里引用代码

scrapyproject/items.py :项目的items文件

scrapyproject/pipelines.py :项目的pipelines文件

scrapyproject/settings.py :项目的设置文件

scrapyproject/spiders/ :具体执行爬虫的目录

  1. 明确目标

在Scrapy中,items是用来管理抓取内容的容器,有点像Python中的Dict,但是提供了一些额外的保护减少错误。

一般来说,item可以用scrapy.item.Item类来创建,并且用scrapy.item.Field对象来定义属性(可以理解成类似于ORM映射关系,类似于java bean)。

编写Item:修改scrapyproject目录下的items.py4文件,在原本的class后面添加我们自己的class。import scrapy

class PyScrapy1601Item(scrapy.Item):

define the fields for your item here like:

name = scrapy.Field()

pass

class DmozItem(scrapy.Item):

node = scrapy.Field()

  1. 爬虫实现

先爬后取

3.1 爬

要建立一个Spider,你必须用scrapy.spider.BaseSpider创建一个子类,并确定三个强制属性:name :爬虫的识别名称,必须是唯一的。

start_urls :爬取的URL列表。爬虫从这里开始抓取数据。

parse() :解析的方法,调用的时候传入从每一个URL传回的Response对象作为唯一参数,负责解析并匹配抓取的数据(解析为item)。

allow_domains :allow_domains是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页。

一个模板:from scrapy.spider import Spider

from scrapy.selector import Selector

from py_scrapy_16_01.py_scrapy_16_01.items import DmozItem

class DmozSpider(Spider):

name = “dmoz”

allowed_domains = [“dmoztools.net”]

start_urls = [

“http://dmoztools.net/Computers/Programming/Languages/Python/”,

]

def parse(self, response):

sel = Selector(response)

sites = sel.xpath(‘//div[@class=”browse-node”]/text()’)

items2 = []

for node in sites:

item = DmozItem()

item[‘href’] = node.extract()

items2.append(item)

return items2

进入到 /scrapyproject/scrapyproject下 运行scrapy crawl dmoz

执行了这条命令发生了啥?

首先,Scrapy为爬虫的 start_urls 属性中的每个URL创建了一个scrapy.http.Request 对象 ,并将爬虫的parse() 方法指定为回调函数。

然后,这些 Request 被调度并执行,之后通过parse()方法返回 scrapy.http.Response 对象,并反馈给爬虫。

3.2 取

爬取整个网页完毕,接下来的就是的取过程了。在基础的爬虫里,这一步可以用正则表达式来抓。在Scrapy里,使用一种叫做 XPath selectors的机制,它基于 XPath表达式。

例子:

/html/head/title : 选择HTML文档元素下面的

标签。

/html/head/title/text() : 选择前面提到的

元素下面的文本内容

//td: 选择所有

元素

//div[@class=”mine”] : 选择所有包含 class=”mine” 属性的div标签元素

xpath路径表达式:表达式描述/从根节点选取

//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置

.选取当前节点

..选取当前节点的父节点

@选取属性

为了方便使用XPaths,Scrapy提供XPathSelector 类,有2种可以选择:HtmlXPathSelector (HTML数据解析)

XmlXPathSelector (XML数据解析)

必须通过一个 Response 对象对他们进行实例化操作,如:sel = Selector(response)

Selector对象展示了文档的节点结构。因此,第一个实例化的selector必与根节点或者是整个目录有关 。

在Scrapy里面,Selectors 有4种基础的方法:xpath() :返回一系列的selectors,每一个select表示一个xpath参数表达式选择的节点。

css() :返回一系列的selectors,每一个select表示一个css参数表达式选择的节点。

extract() :返回一个unicode字符串,即选中的数据。

re() :返回一串一个unicode字符串,即使用正则表达式抓取出来的内容。

3.3 xpath()测试

在终端输入:scrapy shell http://dmoztools.net/Computers/Programming/Languages/Python/

在没有报错的情况下,输入 response.headers 得到:

python爬虫资源路径报错_Python3 Scrapy爬虫框架使用

在没有报错的情况下,输入 response.body 得到:

python爬虫资源路径报错_Python3 Scrapy爬虫框架使用
  1. 存储内容

保存信息的最简单的方法是通过Feed exports,主要有4种:JSON,JSON lines,CSV,XML。

我们将结果用最常用的JSON导出,命令如下:scrapy crawl dmoz -o items.json -t json

其中,-o 后面是导出文件名,-t 后面是导出类型。

  1. Pycharm中运行爬虫程序错误

  2. NameError: global name ‘DmozItem’ is not definedFile “/Users/yannischeng/PycharmProjects/First_Python_Project/spiderone/spiderone/spiders/dmoe_spider.py”, line 20, in parse

item = DmozItem()

NameError: global name ‘DmozItem’ is not defined

解决方案:使用相对导入from ..items import DmozItem

第一个点(.) 表示当前目录,第二个点表示上一级父目录。这样做还有一个额外的好处就是你可以随意修改你的包的名称,松耦合。

  1. Scrapy爬取中文,显示ascii码,如何转变成utf-8正常编码?

将爬取到的中文信息存储为json格式的文件时,文字显示就会出现问题,存储为xml时就不会有问题。本要求应该显示的是:摘要,而实际显示的内容为:”u6458u8981

解决方案:使用json包中的json.dumps(dictname,ensure_ascii=False)

具体案例使用:item[‘node’] = json.dumps(node.extract(), ensure_ascii=False)

print(item[‘node’])

摘要: 把系统换到了fedora,记录几个相关的配置

  1. scrapy` 的 parse() return 值必须是Request, BaseItem, dict or None,如果返回str报错[scrapy.core.scraper] ERROR: Spider must return Request, BaseItem, dict or None, got ‘str’ in

  2. scrapy爬虫得到的json文件是ascii码问题import json #记得添加这两个库

import codecs

class XXXPipeline(object): #XXX就是你建立scrapy工程的名称

def init(self): #添加一下初始化方法

self.file = codecs.open(‘item.json’, ‘wb’, encoding=’utf-8′) #item.json指的是你要保存的json格式文件的名称,编码格式一般都是’utf-8′

def process_item(self, item, spider):

line = json.dumps(dict(item),ensure_ascii=False) + ‘n’ #这一句会将你每次返回的字典抓取出来,”ensure_ascii=False”这一句话很重要,如果是True的话就是我们保存的u4e2du56fd这种格式了

self.file.write(line) #写入到文件中

return item

将以上内容插入pipelines.py,同时在settings.py中加入ITEM_PIPELINES = {

‘panda.pipelines.PandaPipeline’: 300

}

Original: https://blog.csdn.net/weixin_36285931/article/details/113514345
Author: 一笑逢
Title: python爬虫资源路径报错_Python3 Scrapy爬虫框架使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/791135/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球