先看看scrapy的框架流程,

1,安装 scrapy 链接 查看即可。

2,新建scrapy项目

scrapy startproject 项目名

目录结构图

3,cd到项目名下,创建任务。

scrapy genspider 爬虫名 www.baidu.com(网站网址)

参数解析:

name,
定义spider的名字的字符串,必须是唯一的,name是spider的最重要的属性,而且是必须的
allowed_domains
可选,包含spider允许爬取的域名的列表,当offsiterMiddleware启用时,域名不在列表的url不会被跟进
start_urls 
url列表,spider从该列表中开始进行爬取。 (列表生成式也可以实现分页抓取)
start_requests
该方必须返回一个可迭代的对象,对象中包含了spider用于爬取的第一个request.(加for循环,实现翻页抓取)

注:然后去setting里将  ROBOTSTXT_OBEY = False  (不遵循网站的robots协议)

4,在项目的根目录下新建run.py 运行脚本,注意是根目录

from scrapy.cmdline import execute
execute(['scrapy','crawl','lianxi'])

我们的爬虫项目到此也就配置完毕,下面我来说一下setting里的配置说明

DOWNLOAD_DELAY = 2-----------设置爬取间隔
DEFAULT_REQUEST_HEADERS-----------设置头信息
ROBOTSTXT_OBEY = True-----------如果启用,Scrapy将会采用 robots.txt策略
AUTOTHROTTLE_START_DELAY = 5----------开始下载时限速并延迟时间
AUTOTHROTTLE_MAX_DELAY = 60------------高并发请求时最大延迟时间
CONCURRENT_REQUESTS = 16-----------开启线程数量,默认16

setting中可以设置全局请求头信息,

当然在我们的爬虫程序中也可以,不过需要注意cookies的格式,

cookies = {'Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac': '1788*1*PC_VC',...... }  注意是键值对的形式

cookies 字符串转换为字典,

keys = [i.split('=',1)[0] for i in cookie.split('; ')]
values = [i.split('=',1)[1] for i in cookie.split('; ')]
res = dict(zip(keys,values))
print(res)

我们再来看看response的几个方法

url (string) – 这个响应的URL
headers (dict) – 这个响应的标题。字典值可以是字符串(对于单值标题)或列表(对于多值标题)。
status (integer) – 响应的HTTP状态。默认为200。
body (str) – 响应身体。它必须是str,而不是unicode,除非你使用了一个编码感知的Response子类,比如 TextResponse。
text 返回响应str

5,解析工具

1)然后我们再来看一下scrapy为我们封装的 css解析工具。

response.css('.text::text').extract()

这里为提取所有带有class=’text’ 这个属性的元素里面的text返回的是一个列表

response.css('.text::text').extract_first()

这是取第一条,返回的是str

print(response.css("div span::attr(class)").extract())

这是取元素属性

举例:

我来解析一下,在浏览器中我们获取到需要的标签,然后 遍历取到我们需要的标签内容以及它的href属性,注意写法。

css 查询集

2)xpath方法,这种解析方法我们会常用的,我们接着看

url = response.url+response.xpath('/html/body/div/div[2]/div[1]/div[1]/div/a[1]/@href').extract_first()

和原来用法基本一样,这里是获取一个url 然后跟网站的主url拼接了

print(response.xpath("//a[@class='tag']/text()").extract())

https://blog.csdn.net/gongbing798930123/article/details/78955597  这个网址上是xpath语法大全,我这里就不在多说。

3)当然,scrapy还为我们封装了re模块

>>> response.xpath("//span[contains(@class, 'bookmark-btn')]/text()").re('.*?(\d+).*')
['']
>>> response.xpath("//span[contains(@class, 'bookmark-btn')]/text()").re('.*?(\d+).*')[0]
''

不过,我更习惯用原生的re。

extract()解析:

1)extract()方法会把原数据的selector类型转变为列表类型
2)extract()会得到多个值,extract()[1]取第2个值
3)extract_first()得到第一个值,类型为字符串。extract_first(default='')如果没取到返回默认值

6,给Scrapy添加代理

给请求添加代理有2种方式,第一种重写start_request方法,第二种是添加download中间件。

第一种:

 def start_requests(self):
start_url = 'http://httpbin.org/get'
yield scrapy.Request(start_url,self.parse01,meta={'proxy': 'http://113.128.24.29:22121'})

只是在meta中加了一个proxy代理。然后可以测试了,我们通过抓取这个网站就可以返回我们的请求的信息,如:

第二种:

1.在middlewares.py中增加一个类,取名:ProxyMiddleware即代理中间件:

class ProxyMiddleware():
def process_request(self, request, spider):
request.meta['proxy'] = 'http://114.230.126.173:41472'

当然这里还可以设置请求头:

class AgantMiddleware(object):
def __init__(self):
self.user_agent = ['Mozilla/5.0 (Windows NT 10.0; WOW64; rv:58.0) Gecko/20100101 Firefox/58.0',、、、、、、]
def process_request(self,request,spider):
request.headers['User-Agent'] = random.choice(self.user_agent)

然后在 setting中开启中间件:

DOWNLOADER_MIDDLEWARES = {
# 'test01.middlewares.Test01DownloaderMiddleware': 543,
'test01.middlewares.ProxyMiddleware': 543,
}

优先级随意,只要不重复即可,这是设置全局代理ip

7,POST请求

from scrapy import FormRequest ##Scrapy中用作登录使用的一个包
formdata = {
'username': 'wangshang',
'password': 'a706486'
}
yield scrapy.FormRequest(
url='http://172.16.10.119:8080/bwie/login.do',
formdata=formdata,
callback=self.after_login,
)

 8,meta()传参用法,

假如需要从上一个函数传入下一个参数,我们需要。

上个函数中:

yield scrapy.Request(url,self.detail,meta={'title':title,'summary':summary,'views'})

下一个函数中:

response.meta['title']   

接收就可以、

9,爬取信息储存

在item.py里定义需要储存字段。

class CsdnItem(scrapy.Item):
# define the fields for your item here like:
title = scrapy.Field()
summary = scrapy.Field()
views = scrapy.Field()
commits = scrapy.Field()

在爬虫程序中,

from ..items import CsdnItem

def detail(self,response):
item = CsdnItem()
item['title'] = response.meta['title']
item['summary'] = re.sub(r'\s+','',response.meta['summary'])
item['views'] = response.meta['views'] return item

在piplines里,

class Test01Pipeline(object):
def process_item(self, item, spider): title = item['title']
summary = item['summary']
views = item['views']
     return item

注:注释需打开

ITEM_PIPELINES = {
'csdn.pipelines.CsdnPipeline': 300,
}

scrapy 资料整合的更多相关文章

  1. mina学习资料整合

    最好的资料当然是官方文档:https://mina.apache.org/mina-project/userguide/user-guide-toc.html 官方文档,配合源码中的example例子 ...

  2. Machine Learning & Data Mining 资料整合

    机器学习常见算法分类汇总 | 码农网 数据挖掘十大经典算法 | CSDN博客 (内含十个算法具体介绍) 支持向量机通俗导论(理解 SVM 的三层境界)| CSDN博客 (强烈推荐关注博主) 教你如何迅 ...

  3. Weex学习资料整合

    1.weex weex文档:http://weex.apache.org/cn/guide/index.html Weex Ui awesome-weex WEEX免费视频教程-从入门到放肆 (共17 ...

  4. Android + Eclipse + PhoneGap 2.9.0 安卓最新环境配置,部分资料整合网上资料,已成功安装.

    前言:最近心血来潮做了一个以品牌为中心的网站,打算推出本地服务o2o应用.快速开发手机应用,最后选择了phonegap,这里我只是讲述我安装的过程,仅供大家参考. 我开发的一个模型http://www ...

  5. Android + Eclipse + PhoneGap 3.4 安卓最新环境配置,部分资料整合网上资料,已成功安装.

    前言:广州花都论坛,打算推出本地服务o2o应用.快速开发手机应用,phonegap 我的小站,http://www.w30.cn/ 如果有什么问题也可以到小组留言,可以的话,贡献一个ip:) phon ...

  6. eigenface资料整合

    把图片映射到能最好区分的空间(pca),在这个空间同类是聚集的,而不同类之间间隔大.这相当于一个模型,把验证集也映射到此空间,然后利用knn对验证集分类. pca:https://wenku.baid ...

  7. cors跨域的前端实现---根据资料整合的

    1.服务端 搁response中增加Access-Control-Allow-Origin:‘*’ eg:  context.Response.AddHeader("Access-Contr ...

  8. Scrapy开发指南

    一.Scrapy简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. Scrapy基于事件驱动网络框架 Twis ...

  9. Dedecmsv5.7整合ueditor 图片上传添加水印

    最近的项目是做dedecmsv5.7的二次开发,被要求上传的图片要加水印,百度ueditor编辑器不支持自动加水印,所以,找了很多资料整合记录一下,具体效果图 这里不仔细写dedecmsv5.7 整合 ...

随机推荐

  1. 解决SQL将varchar值转换为数据类型为int的列时发生语法错误

    今天遇到一个这样的错误,具体的报错情况如下 解决的方案如下. 数据库MSSQL在比较大小时,出错提示:“将 varchar 值 '24.5' 转换为数据类型为 int 的列时发生语法错!”分析数据库设 ...

  2. UIview需要知道的一些事情:setNeedsDisplay、setNeedsLayout

    UIview需要知道的一些事情:setNeedsDisplay.setNeedsLayout 1.在Mac OS中NSWindow的父类是NSResponder,而在i OS 中UIWindow 的父 ...

  3. XGBoost参数调优

    XGBoost参数调优 http://blog.csdn.net/hhy518518/article/details/54988024 摘要: 转载:http://blog.csdn.NET/han_ ...

  4. SQL Server判断数据库、表、存储过程、函数是否存在

    --判断数据库是否存在 if exists (select * from sys.databases where name = '数据库名') drop database [数据库名] --判断表是否 ...

  5. 如何安装JDeveloper

    1>下载jdk和JDeveloper jdk版本:jdk-7u65-windows-x64.EXE JDeveloper版本:jdev_suite_12.3_win64_V44419-01.is ...

  6. JSFF或JSF页面加载时触发JavaScript之方法

    现象一 最近在项目中遇到这么一个问题,有些页面元素是在页面加载时通过JavaScript动态渲染而成.当生成这些元素的JavaScript脚本被放置于JSPX文件中时,界面渲染没有问题.但是当我们把生 ...

  7. 利率计算v5.0--结对--软件工程

    利率计算v5.--测试--软件工程 1.任务结对同伴: 名字:王昕明 学号: 博客地址 :http://home.cnblogs.com/u/xinmingwang/ Git : https://gi ...

  8. [SoapUI]怎样从应答报文中获取某个字段的值,然后用其改写某个变量

    import com.eviware.soapui.support.GroovyUtils def groovyUtils = new GroovyUtils( context ) def holde ...

  9. 全球顶尖大学的UX课程资源,英文!

    本文由MOCKPLUS团队原创,转载请标明出处,原型设计工具就用更快.更简单的mockplus 要想成为一名优秀的UX设计师,需要掌握很多必备技能.比如,掌握用户体验设计的所有知识和信息架构(易用性方 ...

  10. 关于Android控件EditText的属性InputType的一些经验,java组合多个参数

    关于Android控件EditText的属性InputType的一些经验 2013-11-14 15:08:02|  分类: 默认分类|举报|字号 订阅       1.InputType属性在代码中 ...