Scrapy 是用Python实现一个为爬取网站数据、提取结构性数据而编写的应用框架。
一、Scrapy框架简介
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。
二、架构流程图
Python资源共享群:484031800
接下来的图表展现了Scrapy的架构,包括组件及在系统中发生的数据流的概览(绿色箭头所示)。 下面对每个组件都做了简单介绍,并给出了详细内容的链接。数据流如下所描述。
1、组件
Scrapy Engine
引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。 详细内容查看下面的数据流(Data Flow)部分。
调度器(Scheduler)
调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。
下载器(Downloader)
下载器负责获取页面数据并提供给引擎,而后提供给spider。
Spiders
Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。 更多内容请看 Spiders 。
Item Pipeline
Item Pipeline负责处理被spider提取出来的item。典型的处理有清理、 验证及持久化(例如存取到数据库中)。 更多内容查看 Item Pipeline 。
下载器中间件(Downloader middlewares)
下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。更多内容请看 下载器中间件(Downloader Middleware) 。
Spider中间件(Spider middlewares)
Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。更多内容请看 Spider中间件(Middleware) 。
2、数据流(Data flow)
Scrapy中的数据流由执行引擎控制,其过程如下:
引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。
引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。
引擎向调度器请求下一个要爬取的URL。
调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。
一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。
引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。
Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。
(从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。
3、事件驱动网络(Event-driven networking)
Scrapy基于事件驱动网络框架 Twisted 编写。因此,Scrapy基于并发性考虑由非阻塞(即异步)的实现。
关于异步编程及Twisted更多的内容请查看下列链接:
三、4步制作爬虫
新建项目(scrapy startproject xxx):新建一个新的爬虫项目
明确目标(编写items.py):明确你想要抓取的目标
制作爬虫(spiders/xxsp der.py):制作爬虫开始爬取网页
存储内容(pipelines.py):设计管道存储爬取内容
四、安装框架
这里我们使用 conda 来进行安装:
conda install scrapy
或者使用 pip 进行安装:
pip install scrapy
查看安装:
spider scrapy -h
Scrapy 1.4.0 - no active project
Usage:
scrapy [options] [args]
Available commands:
bench Run quick benchmark test
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
runspider Run a self-contained spider (without creating a project)
settings Get settings values
shell Interactive scraping console
startproject Create new project
version Print Scrapy version
view Open URL in browser, as seen by Scrapy
[ more ] More commands available when run from project directory
Use "scrapy -h" to see more info about a command
1.创建项目
spider scrapy startproject SF
New Scrapy project 'SF', using template directory '/Users/kaiyiwang/anaconda2/lib/python2.7/site-packages/scrapy/templates/project', created in:
/Users/kaiyiwang/Code/python/spider/SF
You can start your first spider with:
cd SF
scrapy genspider example example.com
spider
使用 tree 命令可以查看项目结构:
SF tree
.
├── SF
│ ├── __init__.py
│ ├── items.py
│ ├── middlewares.py
│ ├── pipelines.py
│ ├── settings.py
│ └── spiders
│ └── __init__.py
└── scrapy.cfg
2.在spiders 目录下创建模板
spiders scrapy genspider sf "https://segmentfault.com"
Created spider 'sf' using template 'basic' in module:
SF.spiders.sf
spiders
这样,就生成了一个项目文件 sf.py
# -*- coding: utf-8 -*-
import scrapy
from SF.items import SfItem
class SfSpider(scrapy.Spider):
name = 'sf'
allowed_domains = ['https://segmentfault.com']
start_urls = ['https://segmentfault.com/']
def parse(self, response):
# print response.body
# pass
node_list = response.xpath("//h2[@class='title']")
# 用来存储所有的item字段的
# items = []
for node in node_list:
# 创建item字段对象,用来存储信息
item = SfItem()
# .extract() 将xpath对象转换为 Unicode字符串
title = node.xpath("./a/text()").extract()
item['title'] = title[0]
# 返回抓取到的item数据,给管道文件处理,同时还回来继续执行后边的代码
yield.item
#return item
#return scrapy.Request(url)
#items.append(item)
命令:
# 测试爬虫是否正常, sf为爬虫的名称
scrapy check sf
s
# 运行爬虫
scrapy crawl sf
3.item pipeline
当 item 在Spider中被收集之后,它将会被传递到 item Pipeline, 这些 item Pipeline 组件按定义的顺序处理 item.
每个 Item Pipeline 都是实现了简单方法的Python 类,比如决定此Item是丢弃或存储,以下是 item pipeline 的一些典型应用:
验证爬取得数据(检查item包含某些字段,比如说name字段)
查重(并丢弃)
将爬取结果保存到文件或者数据库总(数据持久化)
编写 item pipeline
编写 item pipeline 很简单,item pipeline 组件是一个独立的Python类,其中 process_item()方法必须实现。
from scrapy.exceptions import DropItem
class PricePipeline(object):
vat_factor = 1.15
def process_item(self, item, spider):
if item['price']:
if item['price_excludes_vat']:
item['price'] = item['price'] * self.vat_factor
return item
else:
raise DropItem("Missing price in %s" % item)
4.选择器(Selectors)
当抓取网页时,你做的最常见的任务是从HTML源码中提取数据。
Selector 有四个基本的方法,最常用的还是Xpath
xpath():传入xpath表达式,返回该表达式所对应的所有节点的selector list 列表。
extract(): 序列化该节点为Unicode字符串并返回list
css():传入CSS表达式,返回该表达式所对应的所有节点的selector list 列表,语法同 BeautifulSoup4
re():根据传入的正则表达式对数据进行提取,返回Unicode 字符串list 列表
Scrapy提取数据有自己的一套机制。它们被称作选择器(seletors),因为他们通过特定的 XPath 或者 CSS 表达式来“选择” HTML文件中的某个部分。
XPath 是一门用来在XML文件中选择节点的语言,也可以用在HTML上。 CSS 是一门将HTML文档样式化的语言。选择器由它定义,并与特定的HTML元素的样式相关连。
Scrapy选择器构建于 lxml 库之上,这意味着它们在速度和解析准确性上非常相似。
XPath表达式的例子:
/html/head/title: 选择文档中标签内的元素
/html/head/title/text(): 选择上面提到的元素的问题
//td: 选择所有的 元素
//div[@class="mine"]:选择所有具有 class="mine" 属性的 div 元素
五、爬取招聘信息
1.爬取腾讯招聘信息
爬取的地址:http://hr.tencent.com/positio...
1.1 创建项目
> scrapy startproject Tencent
You can start your first spider with:
cd Tencent
scrapy genspider example example.com
需要抓取网页的元素:
我们需要爬取以下信息:
职位名:positionName
职位链接:positionLink
职位类型:positionType
职位人数:positionNumber
工作地点:workLocation
发布时点:publishTime
在 items.py 文件中定义爬取的字段:
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html
import scrapy
# 定义字段
class TencentItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 职位名
positionName = scrapy.Field()
# 职位链接
positionLink = scrapy.Field()
# 职位类型
positionType = scrapy.Field()
# 职位人数
positionNumber = scrapy.Field()
# 工作地点
workLocation = scrapy.Field()
# 发布时点
publishTime = scrapy.Field()
pass
1.2 写spider爬虫
使用命令创建
Tencent scrapy genspider tencent "tencent.com"
Created spider 'tencent' using template 'basic' in module:
Tencent.spiders.tencent
生成的 spider 在当前目录下的 spiders/tencent.py
Tencent tree
.
├── __init__.py
├── __init__.pyc
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
├── settings.pyc
└── spiders
├── __init__.py
├── __init__.pyc
└── tencent.py
我们可以看下生成的这个初始化文件 tencent.py
# -*- coding: utf-8 -*-
import scrapy
class TencentSpider(scrapy.Spider):
name = 'tencent'
allowed_domains = ['tencent.com']
start_urls = ['http://tencent.com/']
def parse(self, response):
pass
对初识文件tencent.py进行修改:
# -*- coding: utf-8 -*-
import scrapy
from Tencent.items import TencentItem
class TencentSpider(scrapy.Spider):
name = 'tencent'
allowed_domains = ['tencent.com']
baseURL = "http://hr.tencent.com/position.php?&start="
offset = 0 # 偏移量
start_urls = [baseURL + str(offset)]
def parse(self, response):
# 请求响应
# node_list = response.xpath("//tr[@class='even'] or //tr[@class='odd']")
node_list = response.xpath("//tr[@class='even'] | //tr[@class='odd']")
for node in node_list:
item = TencentItem() # 引入字段类
# 文本内容, 取列表的第一个元素[0], 并且将提取出来的Unicode编码 转为 utf-8
item['positionName'] = node.xpath("./td[1]/a/text()").extract()[0].encode("utf-8")
item['positionLink'] = node.xpath("./td[1]/a/@href").extract()[0].encode("utf-8") # 链接属性
item['positionType'] = node.xpath("./td[2]/text()").extract()[0].encode("utf-8")
item['positionNumber'] = node.xpath("./td[3]/text()").extract()[0].encode("utf-8")
item['workLocation'] = node.xpath("./td[4]/text()").extract()[0].encode("utf-8")
item['publishTime'] = node.xpath("./td[5]/text()").extract()[0].encode("utf-8")
# 返回给管道处理
yield item
# 先爬 2000 页数据
if self.offset < 2000:
self.offset += 10
url = self.baseURL + self.offset
yield scrapy.Request(url, callback = self.parse)
#pass
写管道文件 pipelines.py:
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import json
class TencentPipeline(object):
def __init__(self):
self.f = open("tencent.json", "w")
# 所有的item使用共同的管道
def process_item(self, item, spider):
content = json.dumps(dict(item), ensure_ascii = False) + ",\n"
self.f.write(content)
return item
def close_spider(self, spider):
self.f.close()
管道写好之后,在 settings.py 中启用管道
# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'Tencent.pipelines.TencentPipeline': 300,
}
运行:
> scrapy crawl tencent
File "/Users/kaiyiwang/Code /python/spider /Tencent/Tencent/spiders/tencent.py", line 21, in parse
item['positionName'] = node.xpath("./td[1]/a/text()"). extract()[0].encode("utf-8")
IndexError: list index out of range
请求响应这里写的有问题,Xpath或应该为这种写法:
# 请求响应
# node_list = response.xpath("//tr[@class='even'] or //tr[@class='odd']")
node_list = response.xpath("//tr[@class='even'] | //tr[@class='odd']")
然后再执行命令:
> scrapy crawl tencent
执行结果文件 tencent.json :
{"positionName": "23673-财经运营中心热点运营组编辑", "publishTime": "2017-12-02", "positionLink": "position_detail.php?id=32718&keywords=&tid=0&lid=0", "positionType": "内容编辑类", "workLocation": "北京", "positionNumber": "1"},
{"positionName": "MIG03-腾讯地图高级算法评测工程师(北京)", "publishTime": "2017-12-02", "positionLink": "position_detail.php?id=30276&keywords=&tid=0&lid=0", "positionType": "技术类", "workLocation": "北京", "positionNumber": "1"},
{"positionName": "MIG10-微回收渠道产品运营经理(深圳)", "publishTime": "2017-12-02", "positionLink": "position_detail.php?id=32720&keywords=&tid=0&lid=0", "positionType": "产品/项目类", "workLocation": "深圳", "positionNumber": "1"},
{"positionName": "MIG03-iOS测试开发工程师(北京)", "publishTime": "2017-12-02", "positionLink": "position_detail.php?id=32715&keywords=&tid=0&lid=0", "positionType": "技术类", "workLocation": "北京", "positionNumber": "1"},
{"positionName": "19332-高级PHP开发工程师(上海)", "publishTime": "2017-12-02", "positionLink": "position_detail.php?id=31967&keywords=&tid=0&lid=0", "positionType": "技术类", "workLocation": "上海", "positionNumber": "2"}
1.3 通过下一页爬取
我们上边是通过总的页数来抓取每页数据的,但是没有考虑到每天的数据是变化的,所以,需要爬取的总页数不能写死,那该怎么判断是否爬完了数据呢?其实很简单,我们可以根据下一页来爬取,只要下一页没有数据了,就说明数据已经爬完了。
我们通过 下一页 看下最后一页的特征:
下一页的按钮为灰色,并且链接为 class='noactive'属性了,我们可以根据此特性来判断是否到最后一页了。
# 写死总页数,先爬 100 页数据
"""
if self.offset < 100:
self.offset += 10
url = self.baseURL + str(self.offset)
yield scrapy.Request(url, callback = self.parse)
"""
# 使用下一页爬取数据
if len(response.xpath("//a[@class='noactive' and @id='next']")) == 0:
url = response.xpath("//a[@id='next']/@href").extract()[0]
yield scrapy.Request("http://hr.tencent.com/" + url, callback = self.parse)
修改后的tencent.py文件:
# -*- coding: utf-8 -*-
import scrapy
from Tencent.items import TencentItem
class TencentSpider(scrapy.Spider):
# 爬虫名
name = 'tencent'
# 爬虫爬取数据的域范围
allowed_domains = ['tencent.com']
# 1.需要拼接的URL
baseURL = "http://hr.tencent.com/position.php?&start="
# 需要拼接的URL地址的偏移量
offset = 0 # 偏移量
# 爬虫启动时,读取的URL地址列表
start_urls = [baseURL + str(offset)]
# 用来处理response
def parse(self, response):
# 提取每个response的数据
node_list = response.xpath("//tr[@class='even'] | //tr[@class='odd']")
for node in node_list:
# 构建item对象,用来保存数据
item = TencentItem()
# 文本内容, 取列表的第一个元素[0], 并且将提取出来的Unicode编码 转为 utf-8
print node.xpath("./td[1]/a/text()").extract()
item['positionName'] = node.xpath("./td[1]/a/text()").extract()[0].encode("utf-8")
item['positionLink'] = node.xpath("./td[1]/a/@href").extract()[0].encode("utf-8") # 链接属性
# 进行是否为空判断
if len(node.xpath("./td[2]/text()")):
item['positionType'] = node.xpath("./td[2]/text()").extract()[0].encode("utf-8")
else:
item['positionType'] = ""
item['positionNumber'] = node.xpath("./td[3]/text()").extract()[0].encode("utf-8")
item['workLocation'] = node.xpath("./td[4]/text()").extract()[0].encode("utf-8")
item['publishTime'] = node.xpath("./td[5]/text()").extract()[0].encode("utf-8")
# yield的重要性,是返回数据后还能回来接着执行代码,返回给管道处理,如果为return 整个函数都退出了
yield item
# 第一种写法:拼接URL,适用场景:页面没有可以点击的请求链接,必须通过拼接URL才能获取响应
"""
if self.offset < 100:
self.offset += 10
url = self.baseURL + str(self.offset)
yield scrapy.Request(url, callback = self.parse)
"""
<
# 第二种写法:直接从response获取需要爬取的连接,并发送请求处理,直到连接全部提取完(使用下一页爬取数据)
if len(response.xpath("//a[@class='noactive' and @id='next']")) == 0:
url = response.xpath("//a[@id='next']/@href").extract()[0]
yield scrapy.Request("http://hr.tencent.com/" + url, callback = self.parse)
#pass
OK,通过 根据下一页我们成功爬完招聘信息的所有数据。
1.4 小结
爬虫步骤:
1.创建项目 scrapy project XXX
2.scarpy genspider xxx "http://www.xxx.com"
3.编写 items.py, 明确需要提取的数据
4.编写 spiders/xxx.py, 编写爬虫文件,处理请求和响应,以及提取数据(yield item)
5.编写 pipelines.py, 编写管道文件,处理spider返回item数据,比如本地数据持久化,写文件或存到表中。
6.编写 settings.py,启动管道组件ITEM_PIPELINES,以及其他相关设置
7.执行爬虫 scrapy crawl xxx
有时候被爬取的网站可能做了很多限制,所以,我们请求时可以添加请求报头,scrapy 给我们提供了一个很方便的报头配置的地方,settings.py 中,我们可以开启:
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Tencent (+http://www.yourdomain.com)'
User-AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/62.0.3202.94 Safari/537.36"
# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml, application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
scrapy 最大的适用场景是爬取静态页面,性能非常强悍,但如果要爬取动态的json数据,那就没必要了。
你可能感兴趣的:(Python,Python)
Flask python 开发篇:蓝图的使用
ignativs amor
Python flask python flask 后端
蓝图引言一、为什么使用蓝图?二、蓝图的概念三、创建蓝图四、注册蓝图五、分享我的creat_app方法六、写在最后引言falsk是个轻量级的框架,核心实现简单,但同事可以让开发人员自由的扩展功能。开发中,使用模块导入的方式。一、为什么使用蓝图?将一个应用程序分解为一组蓝图。这对于较大的应用程序是理想的;一个项目可以实例化一个应用程序对象,初始化多个扩展,并注册许多蓝图。-在URL前缀和(或)子域的应
Python生成成绩报告单:从理论到实践
Tech Synapse
python 开发语言
在教育信息化日益普及的今天,自动化生成和处理学生成绩报告单已成为学校和教育机构的一项重要任务。Python作为一种功能强大且易于学习的编程语言,非常适合用于这种数据处理和报告生成任务。本文将详细介绍如何使用Python生成成绩报告单,包括理论概述和完整的代码示例。一、理论概述1.数据存储与处理生成成绩报告单的第一步是存储和处理学生成绩数据。常见的数据存储方式包括CSV文件、Excel文件和数据库。
深入解析LangChain框架:使用Python开发LLM应用的全生命周期指南
m0_57781768
langchain python 网络
深入解析LangChain框架:使用Python开发LLM应用的全生命周期指南前言在当前的人工智能浪潮中,大型语言模型(LLM)已成为众多应用的核心。LangChain是一个专为开发大型语言模型应用而设计的框架,它简化了LLM应用的整个生命周期,包括开发、生产化和部署。本文将详细介绍LangChain框架的各个方面,涵盖其核心组件、第三方集成、开发教程、API参考等,并通过实际案例展示如何使用La
Python多继承时子类如何调用指定父类
lingllllove
python 开发语言
在Python中,多继承是一种强大的特性,允许一个类同时继承多个父类的属性和方法。然而,当多个父类中存在同名方法时,子类需要明确调用哪个父类的方法。本文将详细介绍如何在多继承情况下,子类调用指定父类的方法。一、多继承的基本概念1.1多继承的定义多继承指一个类可以继承多个父类,获取多个父类的属性和方法。classA:defgreet(self):print("HellofromA")classB:d
python flask 蓝图(Blueprint)详解
ldq_sd
python
Blueprint模块化随着flask程序越来越复杂,我们需要对程序进行模块化的处理,针对一个简单的flask程序进行模块化处理举例来说:我们在一个py文件中写入了很多路由,fromflaskimportFlaskapp=Flask(__name__)@app.route('/')defindex():return'index'@app.route('/list')deflist():return
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.4 切片大师:高效操作多维数据的23个技巧
精通代码大仙
numpy python numpy python android
1.4切片大师:高效操作多维数据的23个技巧基础切片start:end:step省略写法负索引多维切片高级技巧视图机制布尔索引花式索引动态切片对象1.4切片大师:高效操作多维数据的23个技巧1.4.1切片操作符的完整语法表NumPy数组的切片操作符与标准Python列表的切片操作符类似,但更加强大,支持多维数组的操作。以下是一个完整的切片操作符语法表,包括正负索引的示意图。1.4.1.1一维数组切
一键获取每日股票数据,自动更新,尽在掌握
舔狼
A股股票数据 python 金融
用Python和Tushare库获取股票日线数据在金融市场分析中,获取股票的历史数据是进行技术分析和量化投资的基础。Tusharetushare官网是一个提供中国股市数据的API接口,它支持获取股票的日线数据、基本面数据等。本文将介绍如何使用Python语言和Tushare库来获取股票的日线数据,并结合多线程技术提高数据获取的效率。1.环境准备首先,确保你的Python环境中安装了以下库:tush
华为OD机试E卷 --响应报文时间 --24年OD统一考试(Java & JS & Python & C & C++)
飞码创造者
最新华为OD机试题库2024 华为od java javascript c++ c语言 python
文章目录题目描述输入描述输出描述用例题目解析JS算法源码Java算法源码python算法源码c算法源码c++算法源码题目描述IGMP协议中,有一个字段称作最大响应时间(MaxResponseTime),HOST收到查询报文,解折出MaxResponsetime字段后,需要在(0,MaXxResponseTime]时间(s)内选取随机时间回应一个响应报文,如果在随机时间内收到一个新的查询报文,则会根
Python之数据库操作
初宸
python mysql python 数据库
Python标准数据库接口为PythonDB-API,PythonDB-API为开发人员提供了数据库应用编程接口。PythonDB-API使用流程:引入API模块获取与数据库的连接执行SQL语句和存储过程关闭数据库连接文章目录MySQLdb创建数据库及表创建数据库:创建数据库表:修改数据库的访问权限(1)修改root的登录限制(2)创建新用户pymysql使用导入pymysql模块连接到数
《Spark大数据分析与内存计算》——第三章
阿万古
课程作业 spark 数据分析 大数据
第三章作业及答案快捷查找:Ctrl+F在搜索框中输入题目一.单选题(共17题)1.(单选题)并不是所有企业都能自己产生数据,从而用于决策辅助,而更多的互联网企业如电商等大部分是要靠什么来抓取互联网数据进行分析A.HadoopB.pythonC.SparkD.网路爬虫正确答案:D:网路爬虫;2.(单选题)什么负责即席查询的应用A.MLlibB.SparkStreamingC.GraphXD.Spar
Python - 安装 Python、pip、virtualenv
伊织产研
# Python python pip 源
文章目录一、PythonUbuntu安装Python问题创建虚拟环境一些使用问题Nomodulenamed'_sqlite3'二、pip(管理第三方库)1、查看pip版本2、安装pip3、升级pip4、卸载pip5、查看已安装的pkg6、第三方库site-packages地址:7、更新8、切换源9、根据requirements.txt安装其它三、virtualenv(管理多个env)1、安装2、查
Python国内镜像源修改教程
网友阿贵
Python python 青少年编程 pycharm 后端
知名国企:豆瓣https://pypi.doubanio.com/simple/网易https://mirrors.163.com/pypi/simple/阿里云https://mirrors.aliyun.com/pypi/simple/腾讯云https://mirrors.cloud.tencent.com/pypi/simple————————————————知名高校:清华大学(推荐):ht
Codeforces Round 971 (Div. 4) ABCD题详细题解(C++,Python)
多思考少编码
Codeforces div3 + div4题解 算法 c++ python 算法竞赛 codeforces
前言:本文为CodeforcesRound971(Div.4)ABCD题的题解,包含C++,Python语言描述,觉得有帮助或者写的不错可以点个赞比赛打了没一半突然unrated了就不是很想继续写了,早起写个题解(之前的div3也没复盘,哎真菜)目录题A:题目大意和解题思路:代码(C++):代码(Python):题B:题目大意和解题思路:代码(C++):代码(Python):题C:题目大意和解题思
Python酷库之旅-第三方库Pandas(049)
神奇夜光杯
python pandas 开发语言 标准库及第三方库 人工智能 excel 学习与成长
目录一、用法精讲176、pandas.Series.rank方法176-1、语法176-2、参数176-3、功能176-4、返回值176-5、说明176-6、用法176-6-1、数据准备176-6-2、代码示例176-6-3、结果输出177、pandas.Series.sem方法177-1、语法177-2、参数177-3、功能177-4、返回值177-5、说明177-6、用法177-6-1、数据准
Jupyter Notebook 与 PyTorch 配置教程
如若123
jupyter pytorch ide
JupyterNotebook与PyTorch配置教程安装build-essential:sudoaptinstallbuild-essential安装编译软件所需的基本工具。安装Python3.8:sudoaptinstallpython3.8如果未安装Python3.8,执行此命令进行安装。下载Miniconda:wgethttps://repo.anaconda.com/miniconda/
fuadmin
jcsx
开源学习 django vue.js
fu-admin-web采用VUE3,TS开发。fu-admin-backend采用Python,Django和Django-Ninija开发。数据库支持MySql,SqlServer,Sqlite。前端采用VbenAdmin、Vue3、AntDesignVue。后端采用Python语言Django框架以及强大的DjangoNinja。支持加载动态权限菜单,多方式轻松权限控制。Vue2项目移步
scikit-learn安装
梁伟静
scikit-learn python
问题:importscikit-learn时遇到如下报错:ImportError:DLLloadfailedwhileimporting_arpack:Thespecifiedprocedurecouldnotbefound.可能原因:python、numpy、scipy和scikit-learn之间的版本出现冲突解决方案:1)卸载numpy、scipy、scikit-learncondaunin
python中函数的定义
xuwentao!!
python
python内部中函数一般定义的方式是:deffunc(a,*args,**kwargs):pass所以在外面调用的时候需要小心的,如果有字典对象传进去需要注意func(a,dict)会报错的,函数会把这个dict当作一个元祖来处理了,但是你想传入字典,所以这里需要解包处理,让函数明白你传入的是一个字典:func(a,**dict)所以在调用函数的时候需要想想是否需要解包处理
paddleseg推理预测文件解析predict.py
weightOneMillion
图像分割 每天一篇PaddleSeg 学习 python 人工智能
1预测命令格式predict.py脚本是专门用来可视化预测案例的,命令格式如下所示:pythonpredict.py\--configconfigs/quick_start/bisenet_optic_disc_512x512_1k.yml\--model_pathoutput/iter_1000/model.pdparams\--ima
python之函数的定义
徐jiankang
python基础 日常总结 python 开发语言
博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞,收藏。目录一、背景二、函数的定义三、参考四、总结一、背景 实际开发过程中,经常会遇到很多完全相同或者非常相似的操作,这时,可以将实现类似操作的代码封装为函数,然后在需要的地方调用该函数。这样不仅可以实现代
深入浅出 Python 函数:编写、使用与高级特性详解
田猿笔记
python 开发语言 函数
引言在Python编程的世界中,函数堪称构建复杂逻辑和模块化程序的基础砖石。它能够帮助程序员组织代码、避免重复,并通过封装逻辑提高代码的可读性和可维护性。本文旨在全方位解析Python函数的核心概念,包括基础定义、文档化、默认参数、可选参数、解包参数、关键字仅参数、注解、可调用性检查、函数名称获取、匿名函数(lambda表达式)、生成器以及装饰器等多种实用特性。一、函数基础与文档化defexamp
Ubuntu python 升级
bianjingshan
linux Python
1.安装新版本pythonsudoapt-getinstallpython3python3被安装在/usr/local/lib路径,到此目录下查看python3的版本号,例如python3.52.删除/usr/bin路径下的pythonlink文件cd/usr/binsudorm-rfpython3.重新建立连接sudoln-s/usr/bin/python3.5/usr/bin/python4.
如何在 Ubuntu 20.04 或 22.04 上安装 Python 3
百川Cs
计算机基础 ubuntu python linux pip conda
以下是关于如何在Ubuntu20.04或22.04上安装Python3的详细步骤。Python是一种广泛使用的编程语言,适用于自动化、数据分析、机器学习等领域。Ubuntu系统通常预装了Python3,但如果需要安装或升级到最新版本,可以按照以下方法操作。检查系统是否已安装Python3打开终端(快捷键:Ctrl+Alt+T)。输入以下命令检查是否已安装Python3:python3--versi
Python pywinauto PC端自动化测试核心代码封装类
《代码爱好者》
ChatGPT python 自动化测试框架 python windows
PythonpywinautoPC端自动化测试核心代码封装类以下是一个基于pywinauto的自动化测试核心代码封装类的完整代码实例,其中包含多个函数实例并加上中文注释方案1importpywinautoimporttimeclassPywinautoWrapper:def__init__(self,app_path):"""初始化函数,传入应用程序的路径"""self.app_path=app_
PySide6与PyQt5的区别
大乔乔布斯
pyqt python qt
虽然PySide6和PyQt5的功能和API十分相似,但由于它们分别是基于不同版本的Qt和由不同的团队维护,是两个不同的Python绑定库,分别用于与Qt库进行交互,可能会在一些细节上表现出差异,一些关键区别:1.维护和授权PySide6:由TheQtCompany官方维护。使用LGPL授权,这意味着你可以在开源和闭源项目中免费使用它(遵守LGPL条款)。版本号与Qt本身一致,PySide6对应于
MySQL 拆分字符串函数Split
大乔乔布斯
mysql 数据库
MYSQL目前没有Hive或者Java。python这列直接split的函数,需要自己定义一个,复制代码,一键使用CREATEDEFINER=`root`@`localhost`FUNCTION`func_split_str`(xVARCHAR(255),--字符串delimVARCHAR(12),--分隔符posINT--按分隔浮拆分后的第几个结果,从1开始数)RETURNSvarchar(25
TypeError: ‘str‘ object is not callable的几种情况及解决办法
兔兔爱学习兔兔爱学习
pandas python 机器学习 深度学习 人工智能
TypeError:‘str’objectisnotcallable的几种情况及解决办法第一个可能,定义了一个str的变量,这个和Python自带函数str的命名冲突了,所以发生这个错误。确实,这是一个情况。这种情况的解决办法就是:严格遵守命名规范,避免命名冲突。第二个可能,是字符串后面加了括号调用的缘故。这一般是由于不了解,对某个对象的细节不清楚,错把属性看成了函数。
Python:实现similarity search相似性搜索算法(附完整源码)
源代码大师
python算法完整教程 python 机器学习
Python:实现similaritysearch相似性搜索算法from__future__importannotationsimportmathimportnumpyasnpdefeuclidean(input_a:np.ndarray,input_b:np.ndarray)->
解锁 Python 与 MySQL 交互密码:全方位技术解析与实战攻略
秋夜Autumn
python MySQL
目录一、引言二、环境准备2.1安装MySQL2.2安装Python及相关库2.2.1使用mysql-connector-python2.2.2使用pymysql三、基本连接与操作3.1连接到MySQL数据库3.2创建游标对象3.3执行SQL查询3.3.1查询单条记录3.3.2查询多条记录3.4插入数据3.5更新数据3.6删除数据3.7关闭连接四、错误处理五、高级操作5.1使用事务5.2处理大型结果
Python Pandas数据清洗与处理
大数据张老师
Python程序设计 python pandas 开发语言
PythonPandas数据清洗与处理在进行数据分析时,原始数据往往包含了许多不完整、不准确或者冗余的信息。数据清洗与处理的任务就是将这些杂乱无章的数据清理干净,确保数据的准确性和一致性,从而为后续的分析工作打下坚实的基础。Pandas提供了强大的工具来帮助我们清洗和处理数据,尤其是在处理Series和DataFrame时,它能够高效地进行数据的筛选、填充、删除、替换等操作。本节将通过一些常见的数
深入浅出Java Annotation(元注解和自定义注解)
Josh_Persistence
Java Annotation 元注解 自定义注解
一、基本概述
Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。
更通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或
mysql优化特定类型的查询
annan211
java 工作 mysql
本节所介绍的查询优化的技巧都是和特定版本相关的,所以对于未来mysql的版本未必适用。
1 优化count查询
对于count这个函数的网上的大部分资料都是错误的或者是理解的都是一知半解的。在做优化之前我们先来看看
真正的count()函数的作用到底是什么。
count()是一个特殊的函数,有两种非常不同的作用,他可以统计某个列值的数量,也可以统计行数。
在统
MAC下安装多版本JDK和切换几种方式
棋子chessman
jdk
环境:
MAC AIR,OS X 10.10,64位
历史:
过去 Mac 上的 Java 都是由 Apple 自己提供,只支持到 Java 6,并且OS X 10.7 开始系统并不自带(而是可选安装)(原自带的是1.6)。
后来 Apple 加入 OpenJDK 继续支持 Java 6,而 Java 7 将由 Oracle 负责提供。
在终端中输入jav
javaScript (1)
Array_06
JavaScript java 浏览器
JavaScript
1、运算符
运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&=)、算术运算符(+,-,*,/,++,--,%)、比较运算符(>,<,<=,>=,==,===,!=,!==)、逻辑运算符(||,&&,!)、条件运算(?:)、位
国内顶级代码分享网站
袁潇含
java jdk oracle .net PHP
现在国内很多开源网站感觉都是为了利益而做的
当然利益是肯定的,否则谁也不会免费的去做网站
&
Elasticsearch、MongoDB和Hadoop比较
随意而生
mongodb hadoop 搜索引擎
IT界在过去几年中出现了一个有趣的现象。很多新的技术出现并立即拥抱了“大数据”。稍微老一点的技术也会将大数据添进自己的特性,避免落大部队太远,我们看到了不同技术之间的边际的模糊化。假如你有诸如Elasticsearch或者Solr这样的搜索引擎,它们存储着JSON文档,MongoDB存着JSON文档,或者一堆JSON文档存放在一个Hadoop集群的HDFS中。你可以使用这三种配
mac os 系统科研软件总结
张亚雄
mac os
1.1 Microsoft Office for Mac 2011
大客户版,自行搜索。
1.2 Latex (MacTex):
系统环境:https://tug.org/mactex/
&nb
Maven实战(四)生命周期
AdyZhang
maven
1. 三套生命周期 Maven拥有三套相互独立的生命周期,它们分别为clean,default和site。 每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。 以clean生命周期为例,它包含的阶段有pre-clean, clean 和 post
Linux下Jenkins迁移
aijuans
Jenkins
1. 将Jenkins程序目录copy过去 源程序在/export/data/tomcatRoot/ofctest-jenkins.jd.com下面 tar -cvzf jenkins.tar.gz ofctest-jenkins.jd.com &
request.getInputStream()只能获取一次的问题
ayaoxinchao
request Inputstream
问题:在使用HTTP协议实现应用间接口通信时,服务端读取客户端请求过来的数据,会用到request.getInputStream(),第一次读取的时候可以读取到数据,但是接下来的读取操作都读取不到数据
原因: 1. 一个InputStream对象在被读取完成后,将无法被再次读取,始终返回-1; 2. InputStream并没有实现reset方法(可以重
数据库SQL优化大总结之 百万级数据库优化方案
BigBird2012
SQL优化
网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。
这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到、纠正以及补充。
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where
jsonObject的使用
bijian1013
java json
在项目中难免会用java处理json格式的数据,因此封装了一个JSONUtil工具类。
JSONUtil.java
package com.bijian.json.study;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
[Zookeeper学习笔记之六]Zookeeper源代码分析之Zookeeper.WatchRegistration
bit1129
zookeeper
Zookeeper类是Zookeeper提供给用户访问Zookeeper service的主要API,它包含了如下几个内部类
首先分析它的内部类,从WatchRegistration开始,为指定的znode path注册一个Watcher,
/**
* Register a watcher for a particular p
【Scala十三】Scala核心七:部分应用函数
bit1129
scala
何为部分应用函数?
Partially applied function: A function that’s used in an expression and that misses some of its arguments.For instance, if function f has type Int => Int => Int, then f and f(1) are p
Tomcat Error listenerStart 终极大法
ronin47
tomcat
Tomcat报的错太含糊了,什么错都没报出来,只提示了Error listenerStart。为了调试,我们要获得更详细的日志。可以在WEB-INF/classes目录下新建一个文件叫logging.properties,内容如下
Java代码
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHa
不用加减符号实现加减法
BrokenDreams
实现
今天有群友发了一个问题,要求不用加减符号(包括负号)来实现加减法。
分析一下,先看最简单的情况,假设1+1,按二进制算的话结果是10,可以看到从右往左的第一位变为0,第二位由于进位变为1。
 
读《研磨设计模式》-代码笔记-状态模式-State
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/*
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况
把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化
如果在
CUDA程序block和thread超出硬件允许值时的异常
cherishLC
CUDA
调用CUDA的核函数时指定block 和 thread大小,该大小可以是dim3类型的(三维数组),只用一维时可以是usigned int型的。
以下程序验证了当block或thread大小超出硬件允许值时会产生异常!!!GPU根本不会执行运算!!!
所以验证结果的正确性很重要!!!
在VS中创建CUDA项目会有一个模板,里面有更详细的状态验证。
以下程序在K5000GPU上跑的。
诡异的超长时间GC问题定位
chenchao051
jvm cms GC hbase swap
HBase的GC策略采用PawNew+CMS, 这是大众化的配置,ParNew经常会出现停顿时间特别长的情况,有时候甚至长到令人发指的地步,例如请看如下日志:
2012-10-17T05:54:54.293+0800: 739594.224: [GC 739606.508: [ParNew: 996800K->110720K(996800K), 178.8826900 secs] 3700
maven环境快速搭建
daizj
安装 mavne 环境配置
一 下载maven
安装maven之前,要先安装jdk及配置JAVA_HOME环境变量。这个安装和配置java环境不用多说。
maven下载地址:http://maven.apache.org/download.html,目前最新的是这个apache-maven-3.2.5-bin.zip,然后解压在任意位置,最好地址中不要带中文字符,这个做java 的都知道,地址中出现中文会出现很多
PHP网站安全,避免PHP网站受到攻击的方法
dcj3sjt126com
PHP
对于PHP网站安全主要存在这样几种攻击方式:1、命令注入(Command Injection)2、eval注入(Eval Injection)3、客户端脚本攻击(Script Insertion)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgerie
yii中给CGridView设置默认的排序根据时间倒序的方法
dcj3sjt126com
GridView
public function searchWithRelated() {
$criteria = new CDbCriteria;
$criteria->together = true; //without th
Java集合对象和数组对象的转换
dyy_gusi
java集合
在开发中,我们经常需要将集合对象(List,Set)转换为数组对象,或者将数组对象转换为集合对象。Java提供了相互转换的工具,但是我们使用的时候需要注意,不能乱用滥用。
1、数组对象转换为集合对象
最暴力的方式是new一个集合对象,然后遍历数组,依次将数组中的元素放入到新的集合中,但是这样做显然过
nginx同一主机部署多个应用
geeksun
nginx
近日有一需求,需要在一台主机上用nginx部署2个php应用,分别是wordpress和wiki,探索了半天,终于部署好了,下面把过程记录下来。
1. 在nginx下创建vhosts目录,用以放置vhost文件。
mkdir vhosts
2. 修改nginx.conf的配置, 在http节点增加下面内容设置,用来包含vhosts里的配置文件
#
ubuntu添加admin权限的用户账号
hongtoushizi
ubuntu useradd
ubuntu创建账号的方式通常用到两种:useradd 和adduser . 本人尝试了useradd方法,步骤如下:
1:useradd
使用useradd时,如果后面不加任何参数的话,如:sudo useradd sysadm 创建出来的用户将是默认的三无用户:无home directory ,无密码,无系统shell。
顾应该如下操作:
第五章 常用Lua开发库2-JSON库、编码转换、字符串处理
jinnianshilongnian
nginx lua
JSON库
在进行数据传输时JSON格式目前应用广泛,因此从Lua对象与JSON字符串之间相互转换是一个非常常见的功能;目前Lua也有几个JSON库,本人用过cjson、dkjson。其中cjson的语法严格(比如unicode \u0020\u7eaf),要求符合规范否则会解析失败(如\u002),而dkjson相对宽松,当然也可以通过修改cjson的源码来完成
Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解
yaerfeng1989
timer quartz 定时器
原创整理不易,转载请注明出处:Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解
代码下载地址:http://www.zuidaima.com/share/1772648445103104.htm
有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz。
1.Java Timer定时
首先继承jav
Linux下df与du两个命令的差别?
pda158
linux
一、df显示文件系统的使用情况,与du比較,就是更全盘化。 最经常使用的就是 df -T,显示文件系统的使用情况并显示文件系统的类型。 举比例如以下: [root@localhost ~]# df -T Filesystem Type &n
[转]SQLite的工具类 ---- 通过反射把Cursor封装到VO对象
ctfzh
VO android sqlite 反射 Cursor
在写DAO层时,觉得从Cursor里一个一个的取出字段值再装到VO(值对象)里太麻烦了,就写了一个工具类,用到了反射,可以把查询记录的值装到对应的VO里,也可以生成该VO的List。
使用时需要注意:
考虑到Android的性能问题,VO没有使用Setter和Getter,而是直接用public的属性。
表中的字段名需要和VO的属性名一样,要是不一样就得在查询的SQL中
该学习笔记用到的Employee表
vipbooks
oracle sql 工作
这是我在学习Oracle是用到的Employee表,在该笔记中用到的就是这张表,大家可以用它来学习和练习。
drop table Employee;
-- 员工信息表
create table Employee(
-- 员工编号
EmpNo number(3) primary key,
-- 姓