关于Scrapy爬取1000张网页的问题

关于Scrapy爬取1000张网页的问题,第1张

1、可能是被服务器封ip了

2、可能是有一些特殊网页,你现有的程序无法解决,报了异常,无法执行

3、链接错误

解决方法是:用单个报错的链接测试一下,是否能够正常运行。

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

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

Scrapy引擎(Engine):负责控制数据流在系统的所有组建中流动,并在相应动作发生触发事件。

调度器(Scheduler):从引擎接收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功能。

Scrapy框架的初步运用

上午刚配置好scrapy框架,下午我就迫不及待的做了一个小demo来测试一下,结果证明scrapy真是太强大了。我感觉等对它掌握到炉火纯青的地步后,就没有什么数据是爬不到的了,O(∩_∩)O哈哈~。

以下步骤是建立在成功安装并配置好scrapy的基础上的

1新建一个Scrapy项目

打开cmd控制台界面 

输入:scrapy startproject myScrapy

下面是创建的工程中所包含的文件

__init__py:项目的初始化文件; 

itemspy:项目的目标文件 

pipelinespy:项目的管道文件 

settingspy:项目的设置文件 

spiders/:存放爬虫代码的文件 

spiders/__init__py:爬虫的初始话文件

2定义Item

Items是保存爬取到的数据的容器,其使用方法和python字典类似, 它提供了额外保护机制来避免拼写错误导致的未定义字段错误,这类似与ORM中的映射关系。

这是itemspy中的默认代码:

import scrapyclass mySpiderItem(scrapyItem):

#name = scrapyField()

pass12345

我们对其进行修改:(我需要爬到数据为 姓名、职业和详细信息)

import scrapyclass MyspiderItem(scrapyItem):

# 这是你需要爬到的数据所包含的字段

name = scrapyField()

title = scrapyField()

info = scrapyField()    pass123456789

3创建爬虫文件

在 spiders/ 下创建文件 demo_spiderpy  

然后NotePad++打开该文件,添加如下代码:

import scrapy#引用mySpider目录下的itempy中的MyspiderItemfrom mySpideritems import MyspiderItemclass Demo_Spider(scrapySpider):

#爬虫名,该值必须唯一

name = "demo"

#爬虫的爬取域(我要拿传智的数据)

allowed_domains = ["itcastcn"]    #起始的URL列表,也就是第一批请求的地址

start_urls = [        "htt/channel/teachershtml"

]    #pase方法负责解析返回的数据response data、获得要提取的数据item,以及生成需要进一步处理URL的Request对象。

def parse(self, response):

#获取的数据集

node_list = responsexpath("//div[@class='li_txt']")

for node in node_list:

item = MyspiderItem()            #extract()将xpath对象转换为Unicode字符串

name = nodexpath("/h3/text()")extract()

title = nodexpath("/h4/text()")extract()

info = nodexpath("/p/text()")extract()

item['name'] = name[0]

item['title'] = title[0]

item['info'] = info[0]            #yield :获得一个item数据后暂停循环,然后将它交给管道,之后继续进行循环

yield item12345678910111213141516171819202122232425262728293031

4修改setting文件

打开settingpy文件,修改ROBOTSTXT_OBEY为false,避免某些网站禁止爬虫导致不能爬取数据。

# Obey robotstxt rulesROBOTSTXT_OBEY = False12

取消ITEM_PIPELINES的的注释,该项定义了管道的优先级,数值越小优先级越高

ITEM_PIPELINES = {    'TencentpipelinesTencentPipeline': 300,

}123

5修改管道执行文件

这是默认的管道文件:

import jsonclass MyspiderPipeline(object):

def process_item(self, item, spider):

pass       12345

我们修改它,如下:

import jsonclass MyspiderPipeline(object):

def __init__(self):

selff = open("demojson","wb+")    #该方法是必要的

def process_item(self, item, spider):

content = jsondumps(dict(item),ensure_ascii = False) + ",\n"

selffwrite(contentencode("utf-8"))        return item    def colse_spider(self,spider):

selffclose()1234567891011121314

添加__init__方法,管道事件第一次执行时,创建demojson文件,并打开。

添加colse_spider方法,管道事件结束时,关闭文件。

修改process_item方法,将Demo_Spider中获得的item数据存到demojson文件中。

5启动spider

在mySpider目录中,创建一个data文件夹,用来存放爬取的数据文件。

输入:mkdir data,然后:cd data/ 

使用命令:scrapy crawl demo 

可以看到,执行完成的详细信息。

demojson文件中获得了需要的数据。

爬取网站数据的简单例子就这样完成了,相信深入学习之后,肯定能实现非常强大的抓取数据功能。

最近在使用scrapy爬取网页时遇到很多不能正常显示、a标签链接失效的情况,多是因为爬下来的网页和路径已经失去了原有的结构,网页无法根据标签的src或者标签的href找到对应的资源,下面就这个问题展开一个小研究。

首先,做这个工作是一定要修改网页的,所以我们引入BeautifulSoup库对网页进行解析。

其次,在本文中 所有的网页以域名为目录名进行保存

下面我们 分情况讨论

大体上看,网页中的链接有以下几种格式:

第一种情况,链接直接以/开头,很明显是从网站的根目录开始检索,那么我们直接将该网站的存储路径加在page前即可(home_path代表当前网页在我们系统中保存的路径,包含域名):

第二种情况,链接直接以>

以上就是关于关于Scrapy爬取1000张网页的问题全部的内容,包括:关于Scrapy爬取1000张网页的问题、如何在scrapy框架下,用python实现爬虫自动跳转页面来抓去网页内容、爬取饿了么官网数据 scrapy等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9282747.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存